{
  "openapi": "3.0.0",
  "paths": {
    "/api": {
      "get": {
        "description": "Public endpoint - No authentication required",
        "operationId": "AppController_getHello",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Used to check if the server is running!",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string",
                  "example": "Hello Novum Server!"
                }
              }
            }
          }
        },
        "summary": "Get API",
        "tags": [
          "Service root"
        ]
      }
    },
    "/api/v1/health-check": {
      "get": {
        "description": "\n      - This endpoint is used to check if the server is running and returns a greeting message and 200 status code.",
        "operationId": "HealthCheckController_healthCheck",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Used for health check!",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string",
                  "example": "OK"
                }
              }
            }
          }
        },
        "summary": "Check server status",
        "tags": [
          "Health check"
        ]
      }
    },
    "/api/v1/auth/current-user": {
      "get": {
        "description": "No specific roles required",
        "operationId": "AuthController_getCurrentUserDetails",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Returns the current user details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CurrentUserDetailsResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Get current user",
        "tags": [
          "Organizations and users"
        ]
      }
    },
    "/api/v1/auth/organizations": {
      "post": {
        "operationId": "AuthController_createOrganization",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateOrganizationDto"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Organization created successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutputDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Create an organization",
        "tags": [
          "Organizations and users"
        ]
      }
    },
    "/api/v1/auth/organization-invite": {
      "post": {
        "description": "Required roles: org_admin",
        "operationId": "AuthController_sendOrganizationInvite",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateOrganizationInviteDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Organization invite sent successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutputDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Send an organization invite",
        "tags": [
          "Organizations and users"
        ]
      }
    },
    "/api/v1/auth/users/{id}/org-roles": {
      "patch": {
        "description": "Required roles: org_admin",
        "operationId": "AuthController_updateUserOrganizationRoles",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Auth0UpdateUserOrgRolesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "User organization roles updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutputDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Update user organization roles",
        "tags": [
          "Organizations and users"
        ]
      }
    },
    "/api/v1/auth/my-org/users": {
      "delete": {
        "description": "Required roles: org_admin",
        "operationId": "AuthController_deleteUserFromOrganization",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteOrganizationMembersDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "User removed from organization successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutputDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Delete users from my organization organization",
        "tags": [
          "Organizations and users"
        ]
      }
    },
    "/api/v1/auth/my-profile": {
      "patch": {
        "operationId": "AuthController_updateMyProfile",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Auth0UpdateUserDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Profile updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutputDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Update my profile",
        "tags": [
          "Organizations and users"
        ]
      }
    },
    "/api/v1/auth/my-organization": {
      "patch": {
        "description": "Required roles: org_admin",
        "operationId": "AuthController_updateMyOrganization",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateOrganizationDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Organization updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutputDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Update my organization",
        "tags": [
          "Organizations and users"
        ]
      }
    },
    "/api/v1/auth/organization/{orgId}/users": {
      "get": {
        "description": "Required roles: org_admin",
        "operationId": "AuthController_getOrganizationUsers",
        "parameters": [
          {
            "name": "orgId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Organization users fetched successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutputDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Get all users in an organization",
        "tags": [
          "Organizations and users"
        ]
      }
    },
    "/api/v1/auth/organization/{orgId}/users/{userId}": {
      "get": {
        "description": "Required roles: org_user",
        "operationId": "AuthController_getOrganizationUser",
        "parameters": [
          {
            "name": "orgId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "userId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "User fetched successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutputDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Get a single user by ID in an organization",
        "tags": [
          "Organizations and users"
        ]
      }
    },
    "/api/v1/auth/organization/{orgId}/invitations": {
      "get": {
        "description": "Required roles: org_admin",
        "operationId": "AuthController_getOrganizationInvitations",
        "parameters": [
          {
            "name": "orgId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Organization invitations fetched successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutputDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Get all invitations for an organization",
        "tags": [
          "Organizations and users"
        ]
      }
    },
    "/api/v1/auth/organization/{orgId}/invitations/{invitationId}": {
      "delete": {
        "description": "Required roles: org_admin",
        "operationId": "AuthController_deleteOrganizationInvitation",
        "parameters": [
          {
            "name": "orgId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "invitationId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Organization invitation deleted successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutputDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Delete an organization invitation",
        "tags": [
          "Organizations and users"
        ]
      }
    },
    "/api/v1/user-settings": {
      "get": {
        "operationId": "UserSettingsController_findForCurrentUser",
        "parameters": [],
        "responses": {
          "200": {
            "description": "User settings for the authenticated profile"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Get current user settings",
        "tags": [
          "User settings"
        ]
      },
      "patch": {
        "operationId": "UserSettingsController_updateForCurrentUser",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserSettingsDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated user settings"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Update current user settings",
        "tags": [
          "User settings"
        ]
      }
    },
    "/api/v1/org-connections": {
      "get": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgConnectionsController_getAllConnections",
        "parameters": [],
        "responses": {
          "200": {
            "description": "All connections retrieved successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetAllConnectionsResponseDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "List org connections",
        "tags": [
          "All connections"
        ]
      }
    },
    "/api/v1/org-connections/databases": {
      "post": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgDatabasesConnectionController_createDatabase",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateOrgDatabaseExampleDto"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Database connection created successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrgDatabaseResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input data"
          },
          "409": {
            "description": "Database connection with this name already exists for the organization"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Create database",
        "tags": [
          "Databases"
        ]
      },
      "get": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgDatabasesConnectionController_findAllDatabases",
        "parameters": [],
        "responses": {
          "200": {
            "description": "List of database connections retrieved successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/OrgDatabaseResponseDto"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "List databases",
        "tags": [
          "Databases"
        ]
      }
    },
    "/api/v1/org-connections/databases/{id}": {
      "get": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgDatabasesConnectionController_findOneDatabase",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Database connection ID",
            "schema": {
              "example": "123e4567-e89b-12d3-a456-426614174000",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Database connection retrieved successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrgDatabaseResponseDto"
                }
              }
            }
          },
          "404": {
            "description": "Database connection not found"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Get database",
        "tags": [
          "Databases"
        ]
      },
      "patch": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgDatabasesConnectionController_updateDatabase",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Database connection ID",
            "schema": {
              "example": "123e4567-e89b-12d3-a456-426614174000",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateOrgDatabaseDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Database connection updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrgDatabaseResponseDto"
                }
              }
            }
          },
          "404": {
            "description": "Database connection not found"
          },
          "409": {
            "description": "Database connection with this name already exists for the organization"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Update database",
        "tags": [
          "Databases"
        ]
      },
      "delete": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgDatabasesConnectionController_removeDatabase",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Database connection ID",
            "schema": {
              "example": "123e4567-e89b-12d3-a456-426614174000",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Database connection deleted successfully"
          },
          "404": {
            "description": "Database connection not found"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Delete database",
        "tags": [
          "Databases"
        ]
      }
    },
    "/api/v1/org-connections/databases/{id}/test-connection": {
      "post": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgDatabasesConnectionController_testDatabaseConnection",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Database connection ID",
            "schema": {
              "example": "123e4567-e89b-12d3-a456-426614174000",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Database connection test result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "example": true
                    },
                    "message": {
                      "type": "string",
                      "example": "PostgreSQL connection successful"
                    },
                    "details": {
                      "type": "object",
                      "example": {
                        "testQuery": {
                          "test": 1
                        }
                      },
                      "description": "Additional connection test details"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Database connection test failed"
          },
          "404": {
            "description": "Database connection not found"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Test connection",
        "tags": [
          "Databases"
        ]
      }
    },
    "/api/v1/org-connections/databases/{id}/set-default": {
      "patch": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgDatabasesConnectionController_setAsDefault",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Database connection ID",
            "schema": {
              "example": "123e4567-e89b-12d3-a456-426614174000",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Database connection set as default successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrgDatabaseResponseDto"
                }
              }
            }
          },
          "404": {
            "description": "Database connection not found"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Set default",
        "tags": [
          "Databases"
        ]
      }
    },
    "/api/v1/org-connections/fossid": {
      "post": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgFossidConnectionController_create",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/CreateOrgFossidKbConnectionDto"
                  },
                  {
                    "$ref": "#/components/schemas/CreateOrgFossidWorkbenchConnectionDto"
                  }
                ],
                "discriminator": {
                  "propertyName": "type"
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "FossID connection created successfully",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/OrgFossidKbConnectionResponseDto"
                    },
                    {
                      "$ref": "#/components/schemas/OrgFossidWorkbenchConnectionResponseDto"
                    }
                  ],
                  "discriminator": {
                    "propertyName": "type"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid input data"
          },
          "409": {
            "description": "FossID connection with this name already exists for the organization"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Create FossID",
        "tags": [
          "FossID"
        ]
      },
      "get": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgFossidConnectionController_findAll",
        "parameters": [],
        "responses": {
          "200": {
            "description": "List of FossID connections retrieved successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "oneOf": [
                      {
                        "$ref": "#/components/schemas/OrgFossidKbConnectionResponseDto"
                      },
                      {
                        "$ref": "#/components/schemas/OrgFossidWorkbenchConnectionResponseDto"
                      }
                    ],
                    "discriminator": {
                      "propertyName": "type"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Get FossID",
        "tags": [
          "FossID"
        ]
      }
    },
    "/api/v1/org-connections/fossid/{id}": {
      "get": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgFossidConnectionController_findOne",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "FossID connection ID",
            "schema": {
              "example": "123e4567-e89b-12d3-a456-426614174000",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "FossID connection retrieved successfully",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/OrgFossidKbConnectionResponseDto"
                    },
                    {
                      "$ref": "#/components/schemas/OrgFossidWorkbenchConnectionResponseDto"
                    }
                  ],
                  "discriminator": {
                    "propertyName": "type"
                  }
                }
              }
            }
          },
          "404": {
            "description": "FossID connection not found"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Get FossID by ID",
        "tags": [
          "FossID"
        ]
      },
      "patch": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgFossidConnectionController_update",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "FossID connection ID",
            "schema": {
              "example": "123e4567-e89b-12d3-a456-426614174000",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/UpdateOrgFossidKbConnectionDto"
                  },
                  {
                    "$ref": "#/components/schemas/UpdateOrgFossidWorkbenchConnectionDto"
                  }
                ],
                "discriminator": {
                  "propertyName": "type"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "FossID connection updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/OrgFossidKbConnectionResponseDto"
                    },
                    {
                      "$ref": "#/components/schemas/OrgFossidWorkbenchConnectionResponseDto"
                    }
                  ],
                  "discriminator": {
                    "propertyName": "type"
                  }
                }
              }
            }
          },
          "404": {
            "description": "FossID connection not found"
          },
          "409": {
            "description": "FossID connection with this name already exists for the organization"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Update FossID",
        "tags": [
          "FossID"
        ]
      },
      "delete": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgFossidConnectionController_remove",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "FossID connection ID",
            "schema": {
              "example": "123e4567-e89b-12d3-a456-426614174000",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "FossID connection deleted successfully"
          },
          "404": {
            "description": "FossID connection not found"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Delete FossID",
        "tags": [
          "FossID"
        ]
      }
    },
    "/api/v1/org-connections/fossid/{id}/test-connection": {
      "post": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgFossidConnectionController_testConnection",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "FossID connection ID",
            "schema": {
              "example": "123e4567-e89b-12d3-a456-426614174000",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "FossID connection test result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "example": true
                    },
                    "message": {
                      "type": "string",
                      "example": "FossID connection successful"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "FossID connection not found"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Test connection",
        "tags": [
          "FossID"
        ]
      }
    },
    "/api/v1/org-connections/fossid/{id}/set-default": {
      "patch": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgFossidConnectionController_setAsDefault",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "FossID connection ID",
            "schema": {
              "example": "123e4567-e89b-12d3-a456-426614174000",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "FossID connection set as default successfully",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/OrgFossidKbConnectionResponseDto"
                    },
                    {
                      "$ref": "#/components/schemas/OrgFossidWorkbenchConnectionResponseDto"
                    }
                  ],
                  "discriminator": {
                    "propertyName": "type"
                  }
                }
              }
            }
          },
          "404": {
            "description": "FossID connection not found"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Set default",
        "tags": [
          "FossID"
        ]
      }
    },
    "/api/v1/org-connections/storages": {
      "post": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgStoragesConnectionController_createStorage",
        "parameters": [],
        "responses": {
          "501": {
            "description": "Not implemented yet"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Create storage",
        "tags": [
          "Storages"
        ]
      },
      "get": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgStoragesConnectionController_findAllStorages",
        "parameters": [],
        "responses": {
          "501": {
            "description": "Not implemented yet"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "List storages",
        "tags": [
          "Storages"
        ]
      }
    },
    "/api/v1/org-connections/storages/{id}": {
      "get": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgStoragesConnectionController_findOneStorage",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Storage connection ID",
            "schema": {
              "example": "123e4567-e89b-12d3-a456-426614174000",
              "type": "string"
            }
          }
        ],
        "responses": {
          "501": {
            "description": "Not implemented yet"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Get storage",
        "tags": [
          "Storages"
        ]
      },
      "patch": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgStoragesConnectionController_updateStorage",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Storage connection ID",
            "schema": {
              "example": "123e4567-e89b-12d3-a456-426614174000",
              "type": "string"
            }
          }
        ],
        "responses": {
          "501": {
            "description": "Not implemented yet"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Update storage",
        "tags": [
          "Storages"
        ]
      },
      "delete": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgStoragesConnectionController_removeStorage",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Storage connection ID",
            "schema": {
              "example": "123e4567-e89b-12d3-a456-426614174000",
              "type": "string"
            }
          }
        ],
        "responses": {
          "501": {
            "description": "Not implemented yet"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Delete storage",
        "tags": [
          "Storages"
        ]
      }
    },
    "/api/v1/org-connections/storages/{id}/test-connection": {
      "post": {
        "description": "Required roles: org_admin, org_user",
        "operationId": "OrgStoragesConnectionController_testStorageConnection",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Storage connection ID",
            "schema": {
              "example": "123e4567-e89b-12d3-a456-426614174000",
              "type": "string"
            }
          }
        ],
        "responses": {
          "501": {
            "description": "Not implemented yet"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Test connection",
        "tags": [
          "Storages"
        ]
      }
    },
    "/api/v1/workflows": {
      "post": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "WorkflowsController_create",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateWorkflowApiExampleDto"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The workflow has been successfully created.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetWorkflowResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Create a new workflow with validations (v2)",
        "tags": [
          "Workflows"
        ]
      },
      "get": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "WorkflowsController_findAllLegacy",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The workflows have been successfully retrieved.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetWorkflowsResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "List workflows",
        "tags": [
          "Workflows"
        ]
      }
    },
    "/api/v1/workflows/all-new": {
      "get": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "WorkflowsController_findAllPaginated",
        "parameters": [
          {
            "name": "page",
            "required": false,
            "in": "query",
            "description": "Page number (1-based)",
            "schema": {
              "minimum": 1,
              "default": 1,
              "type": "number"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Items per page",
            "schema": {
              "minimum": 1,
              "maximum": 100,
              "default": 10,
              "type": "number"
            }
          },
          {
            "name": "sortBy",
            "required": false,
            "in": "query",
            "description": "Field to sort workflows by",
            "schema": {
              "default": "updatedAt",
              "enum": [
                "name",
                "status",
                "updatedAt",
                "createdAt"
              ],
              "type": "string"
            }
          },
          {
            "name": "sortOrder",
            "required": false,
            "in": "query",
            "description": "Sort direction",
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "type": "string"
            }
          },
          {
            "name": "name",
            "required": false,
            "in": "query",
            "description": "Filter by workflow name (case-insensitive partial match)",
            "schema": {
              "example": "my workflow",
              "type": "string"
            }
          },
          {
            "name": "status",
            "required": false,
            "in": "query",
            "description": "Filter by workflow status",
            "schema": {
              "example": "PUBLISHED",
              "enum": [
                "DRAFT",
                "PUBLISHED",
                "STOPPED"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The workflows have been successfully retrieved.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetWorkflowsResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Get all new",
        "tags": [
          "Workflows"
        ]
      }
    },
    "/api/v1/workflows/check-github-app-workflow": {
      "get": {
        "description": "Public endpoint - No authentication required",
        "operationId": "WorkflowsController_checkGithubAppWorkflow",
        "parameters": [
          {
            "name": "workflowId",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "repository",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Workflow check completed successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "exists": {
                      "type": "boolean",
                      "description": "Whether a matching workflow exists"
                    },
                    "workflowIds": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Array of workflow IDs that match (empty if none found)"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Either workflowId or repository must be provided, or workflow does not support GitHub triggers"
          },
          "404": {
            "description": "Workflow not found or no workflows found for repository"
          }
        },
        "summary": "Check GitHub app workflow",
        "tags": [
          "Workflows"
        ]
      }
    },
    "/api/v1/workflows/{id}": {
      "get": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "WorkflowsController_findOne",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The workflow has been successfully retrieved.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetWorkflowResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Get workflow",
        "tags": [
          "Workflows"
        ]
      },
      "put": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "WorkflowsController_update",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWorkflowDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The workflow has been successfully updated.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateWorkflowResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Update workflow",
        "tags": [
          "Workflows"
        ]
      },
      "delete": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "WorkflowsController_remove",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "The workflow has been successfully deleted."
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Delete workflow",
        "tags": [
          "Workflows"
        ]
      }
    },
    "/api/v1/workflows/{id}/metadata": {
      "patch": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "WorkflowsController_updateMetadata",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWorkflowMetadataDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The workflow metadata has been successfully updated.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateWorkflowResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Update metadata",
        "tags": [
          "Workflows"
        ]
      }
    },
    "/api/v1/workflows/{id}/status": {
      "patch": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "WorkflowsController_updateStatus",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWorkflowStatusDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The workflow has been successfully updated.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateWorkflowResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Update status",
        "tags": [
          "Workflows"
        ]
      }
    },
    "/api/v1/workflows/check-flow": {
      "post": {
        "description": "Public endpoint - No authentication required",
        "operationId": "WorkflowsController_checkWorkflowFlow",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CheckWorkflowFlowDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The workflow flow has been successfully checked."
          }
        },
        "summary": "Check flow",
        "tags": [
          "Workflows"
        ]
      }
    },
    "/api/v1/workflows/start-local": {
      "post": {
        "description": "Public endpoint - No authentication required",
        "operationId": "WorkflowsController_startLocalWorkflowExecution",
        "parameters": [],
        "requestBody": {
          "required": true,
          "description": "Files and metadata for workflow execution",
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/UploadWorkflowFilesDto"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Files uploaded successfully and workflow execution started",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StartWorkflowExecutionUploadResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad request - Invalid file format or missing required fields"
          },
          "413": {
            "description": "Payload too large - File size exceeds limit"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Start local",
        "tags": [
          "Workflows"
        ]
      }
    },
    "/api/v1/workflows/start-github-app": {
      "post": {
        "description": "Public endpoint - No authentication required",
        "operationId": "WorkflowsController_startGithubAppWorkflowExecution",
        "parameters": [],
        "requestBody": {
          "required": true,
          "description": "Files and metadata for workflow execution (nodeId not required)",
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "files": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "metadata": {
                    "type": "string",
                    "description": "JSON array of file metadata without nodeId (e.g., [{\"fileName\": \"file1.json\"}])",
                    "example": "[{\"fileName\": \"sbom.json\"}]"
                  },
                  "workflowId": {
                    "type": "string",
                    "format": "uuid",
                    "description": "The ID of the workflow to execute (optional if repository is provided)"
                  },
                  "repository": {
                    "type": "string",
                    "description": "Repository name (e.g., owner/repo) to lookup workflows by repository parameter. All matching workflows will be started (optional if workflowId is provided)"
                  },
                  "uploadingEmail": {
                    "type": "string",
                    "format": "email",
                    "description": "Email of the user uploading the files"
                  },
                  "githubEventType": {
                    "type": "string",
                    "description": "GitHub event type that triggered this workflow (e.g., \"On PR Creation\", \"On Each Commit\")",
                    "enum": [
                      "On PR Creation",
                      "On Each Commit"
                    ]
                  }
                },
                "required": [
                  "files",
                  "metadata",
                  "uploadingEmail"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Files uploaded successfully and workflow execution started",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StartWorkflowExecutionUploadResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad request - Invalid file format or missing required fields"
          },
          "413": {
            "description": "Payload too large - File size exceeds limit"
          }
        },
        "summary": "Start GitHub app",
        "tags": [
          "Workflows"
        ]
      }
    },
    "/api/v1/workflows/{id}/start-details": {
      "get": {
        "description": "Public endpoint - No authentication required",
        "operationId": "WorkflowsController_getWorkflowStartDetails",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The workflow status has been successfully retrieved.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetWorkflowStartDetailsResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Start details",
        "tags": [
          "Workflows"
        ]
      }
    },
    "/api/v1/workflows/{id}/executions": {
      "get": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "WorkflowsController_getWorkflowExecutions",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The workflow executions have been successfully retrieved.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetWorkflowExecutionsResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "List executions",
        "tags": [
          "Workflows"
        ]
      }
    },
    "/api/v1/workflows/{id}/trigger-database-polling": {
      "post": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "WorkflowsController_triggerSingleWorkflowDatabasePolling",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Single workflow database polling has been successfully triggered."
          },
          "403": {
            "description": "You do not have permission to trigger this workflow."
          },
          "404": {
            "description": "Workflow not found or is not a database-read workflow."
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Trigger database polling",
        "tags": [
          "Workflows"
        ]
      }
    },
    "/api/v1/sbom-reviews/by-execution/{executionId}": {
      "get": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "ReviewReportApprovalsController_findByExecutionId",
        "parameters": [
          {
            "name": "executionId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of reviews (possibly empty)"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Get by execution",
        "tags": [
          "Reviews"
        ]
      }
    },
    "/api/v1/sbom-reviews/by-workflow/{workflowId}": {
      "get": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "ReviewReportApprovalsController_findByWorkflowId",
        "parameters": [
          {
            "name": "workflowId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of reviews (possibly empty)"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Get by workflow",
        "tags": [
          "Reviews"
        ]
      }
    },
    "/api/v1/sbom-reviews/{id}": {
      "get": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "ReviewReportApprovalsController_getById",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Review found"
          },
          "404": {
            "description": "Review not found"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Get SBOM review",
        "tags": [
          "Reviews"
        ]
      }
    },
    "/api/v1/sbom-reviews/{id}/download": {
      "get": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "ReviewReportApprovalsController_downloadFile",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "File streamed"
          },
          "404": {
            "description": "Review or file not found"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Download",
        "tags": [
          "Reviews"
        ]
      }
    },
    "/api/v1/sbom-reviews/{id}/approve": {
      "post": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "ReviewReportApprovalsController_approveById",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SubmitReviewDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Workflow continued from the review node"
          },
          "404": {
            "description": "Review not found or already processed"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Approve",
        "tags": [
          "Reviews"
        ]
      }
    },
    "/api/v1/sbom-reviews/{id}/reject": {
      "post": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "ReviewReportApprovalsController_rejectById",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SubmitReviewDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Node marked as failed"
          },
          "404": {
            "description": "Review not found or already processed"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Reject",
        "tags": [
          "Reviews"
        ]
      }
    },
    "/api/v1/workflow-executions/{executionId}/output-nodes": {
      "get": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "WorkflowExecutionsController_getWorkflowExecutionOutputNodes",
        "parameters": [
          {
            "name": "executionId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The workflow execution output nodes have been successfully retrieved.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetWorkflowExecutionOutputNodesResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "List output nodes",
        "tags": [
          "Executions"
        ]
      }
    },
    "/api/v1/workflow-executions/{executionId}/input-files/{fileName}/download": {
      "get": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "WorkflowExecutionsController_downloadInputFile",
        "parameters": [
          {
            "name": "executionId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "fileName",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The input file has been successfully downloaded."
          },
          "404": {
            "description": "Input file not found."
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Download input file",
        "tags": [
          "Executions"
        ]
      }
    },
    "/api/v1/workflow-executions/{executionId}/nodes/{nodeId}/download": {
      "get": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "WorkflowExecutionsController_downloadNodeOutputFile",
        "parameters": [
          {
            "name": "executionId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "nodeId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The file has been successfully downloaded."
          },
          "404": {
            "description": "Node or file not found."
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Download node",
        "tags": [
          "Executions"
        ]
      }
    },
    "/api/v1/workflow-executions/{executionId}/nodes/{nodeId}/runs/{runId}/download": {
      "get": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "WorkflowExecutionsController_downloadNodeRunOutputFile",
        "parameters": [
          {
            "name": "executionId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "nodeId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "runId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The file has been successfully downloaded."
          },
          "404": {
            "description": "Run or file not found."
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Download run",
        "tags": [
          "Executions"
        ]
      }
    },
    "/api/v1/workflow-executions/{executionId}/download-all": {
      "get": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "WorkflowExecutionsController_downloadAllOutputFiles",
        "parameters": [
          {
            "name": "executionId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "All output files have been successfully downloaded as a zip."
          },
          "404": {
            "description": "Workflow execution not found or no output files available."
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Download all",
        "tags": [
          "Executions"
        ]
      }
    },
    "/api/v1/workflow-executions/{executionId}": {
      "delete": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "WorkflowExecutionsController_deleteWorkflowExecution",
        "parameters": [
          {
            "name": "executionId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "The workflow execution has been successfully deleted."
          },
          "404": {
            "description": "Workflow execution not found."
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Delete workflow execution",
        "tags": [
          "Executions"
        ]
      }
    },
    "/api/v1/tags": {
      "get": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "TagsController_listForOrg",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetOrgTagsResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "List tags",
        "tags": [
          "Tags"
        ]
      },
      "post": {
        "description": "Required roles: org_admin",
        "operationId": "TagsController_create",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateOrgTagDto"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetOrgTagResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Create tag",
        "tags": [
          "Tags"
        ]
      }
    },
    "/api/v1/tags/{id}": {
      "delete": {
        "description": "Required roles: org_admin",
        "operationId": "TagsController_remove",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Tag removed"
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Delete tag",
        "tags": [
          "Tags"
        ]
      }
    },
    "/api/v1/workflow-templates": {
      "get": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "WorkflowTemplatesController_findAll",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Templates retrieved successfully.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetWorkflowTemplatesResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "List workflow templates",
        "tags": [
          "Templates"
        ]
      },
      "post": {
        "description": "Required roles: org_admin",
        "operationId": "WorkflowTemplatesController_create",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateWorkflowTemplateDto"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Template created successfully.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetWorkflowTemplateResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Create workflow template",
        "tags": [
          "Templates"
        ]
      }
    },
    "/api/v1/workflow-templates/{id}": {
      "get": {
        "description": "Required roles: org_user, org_admin",
        "operationId": "WorkflowTemplatesController_findOne",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Template retrieved successfully.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetWorkflowTemplateResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Get workflow template",
        "tags": [
          "Templates"
        ]
      },
      "patch": {
        "description": "Required roles: org_admin",
        "operationId": "WorkflowTemplatesController_update",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWorkflowTemplateDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Template updated successfully.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetWorkflowTemplateResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Update workflow template",
        "tags": [
          "Templates"
        ]
      },
      "delete": {
        "description": "Required roles: org_admin",
        "operationId": "WorkflowTemplatesController_remove",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Template deleted successfully."
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Delete workflow template",
        "tags": [
          "Templates"
        ]
      }
    },
    "/api/v1/nodes": {
      "get": {
        "description": "Public endpoint - No authentication required",
        "operationId": "NodesController_findAll",
        "parameters": [],
        "responses": {
          "200": {
            "description": "List of all available default nodes",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetNodesResDto"
                }
              }
            }
          }
        },
        "summary": "List nodes",
        "tags": [
          "Nodes"
        ]
      }
    },
    "/api/v1/statistics/dashboard": {
      "get": {
        "description": "Required roles: org_user, org_admin, super_admin",
        "operationId": "StatisticsController_getDashboardStatistics",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Dashboard statistics retrieved successfully.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetDashboardStatisticsResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "Get dashboard",
        "tags": [
          "Statistics"
        ]
      }
    },
    "/api/v1/statistics/recent-executions": {
      "get": {
        "description": "Required roles: org_user, org_admin, super_admin",
        "operationId": "StatisticsController_getRecentExecutions",
        "parameters": [
          {
            "name": "page",
            "required": false,
            "in": "query",
            "description": "Page number (1-based)",
            "schema": {
              "minimum": 1,
              "default": 1,
              "type": "number"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Items per page",
            "schema": {
              "minimum": 1,
              "maximum": 100,
              "default": 10,
              "type": "number"
            }
          },
          {
            "name": "sortBy",
            "required": false,
            "in": "query",
            "description": "Field to sort recent executions by",
            "schema": {
              "default": "startedAt",
              "enum": [
                "startedAt",
                "completedAt",
                "triggeredByEmail",
                "durationMs"
              ],
              "type": "string"
            }
          },
          {
            "name": "sortOrder",
            "required": false,
            "in": "query",
            "description": "Sort direction",
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "type": "string"
            }
          },
          {
            "name": "status",
            "required": false,
            "in": "query",
            "description": "Filter by execution status. Use \"failed\", \"in_progress\", or \"completed\".",
            "schema": {
              "enum": [
                "pending",
                "in_progress",
                "pending_approval",
                "completed",
                "partially_completed",
                "error_handled",
                "failed",
                "rejected"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Recent executions retrieved successfully.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetRecentExecutionsResDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwt": []
          }
        ],
        "summary": "List recent executions",
        "tags": [
          "Statistics"
        ]
      }
    }
  },
  "info": {
    "title": "Workflows API",
    "description": "The REST API behind FossID Workflows — trigger workflow executions, inspect their progress and results, and manage workflows, connections, and users programmatically.\n\nAll endpoints require a bearer token: send `Authorization: Bearer <token>` with a JWT issued for your organization.",
    "version": "1.0",
    "contact": {}
  },
  "tags": [
    {
      "name": "Service root",
      "description": "Service root endpoint."
    },
    {
      "name": "Health check",
      "description": "Service liveness."
    },
    {
      "name": "Organizations and users",
      "description": "Organization membership, invitations, roles, and profiles."
    },
    {
      "name": "User settings",
      "description": "Per-user preferences."
    },
    {
      "name": "All connections",
      "description": "Every registered connection, of any type."
    },
    {
      "name": "Databases",
      "description": "Databases the organization has registered."
    },
    {
      "name": "FossID",
      "description": "FossID Knowledge Base and Workbench connections."
    },
    {
      "name": "Storages",
      "description": "Storage destinations the organization has registered."
    },
    {
      "name": "Workflows",
      "description": ""
    },
    {
      "name": "Reviews",
      "description": "Human approval gates awaiting a decision."
    },
    {
      "name": "Executions",
      "description": "Individual runs of a workflow, and the files they produced."
    },
    {
      "name": "Tags",
      "description": "Labels for organizing workflows."
    },
    {
      "name": "Templates",
      "description": "Reusable starting graphs for new workflows."
    },
    {
      "name": "Nodes",
      "description": "The catalog of node types available to build with."
    },
    {
      "name": "Statistics",
      "description": "The figures behind the dashboard."
    }
  ],
  "servers": [
    {
      "url": "https://{host}",
      "description": "FossID Workflows instance",
      "variables": {
        "host": {
          "default": "workflows.fossid.com",
          "description": "Hostname of your Workflows instance"
        }
      }
    }
  ],
  "components": {
    "securitySchemes": {
      "jwt": {
        "scheme": "Bearer",
        "bearerFormat": "Bearer",
        "description": "[just text field] Please enter token in following format: Bearer &lt;JWT>",
        "name": "Authorization",
        "type": "http",
        "in": "Header"
      }
    },
    "schemas": {
      "BrandingDto": {
        "type": "object",
        "properties": {
          "logo_url": {
            "type": "string"
          },
          "colors": {
            "type": "object",
            "properties": {
              "primary": {
                "type": "string"
              },
              "page_background": {
                "type": "string"
              }
            },
            "required": [
              "primary",
              "page_background"
            ]
          }
        }
      },
      "CurrentUserOrganizationDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique identifier for the organization"
          },
          "name": {
            "type": "string",
            "description": "Name of the organization"
          },
          "display_name": {
            "type": "string",
            "description": "Display name of the organization"
          },
          "branding": {
            "description": "Metadata associated with the organization",
            "allOf": [
              {
                "$ref": "#/components/schemas/BrandingDto"
              }
            ]
          },
          "roles": {
            "description": "Roles associated with the user in the organization",
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "id",
          "name",
          "display_name",
          "branding",
          "roles"
        ]
      },
      "CurrentUserDetailsResDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique identifier for the user"
          },
          "email": {
            "type": "string",
            "description": "Email address of the user"
          },
          "name": {
            "type": "object",
            "description": "Full name of the user"
          },
          "nickname": {
            "type": "object",
            "description": "Nickname of the user"
          },
          "picture": {
            "type": "object",
            "description": "Profile picture URL of the user"
          },
          "email_verified": {
            "type": "boolean",
            "description": "Indicates if the user has verified their email address"
          },
          "currentOrgId": {
            "type": "object",
            "description": "Current organization id"
          },
          "organizations": {
            "description": "List of organizations the user is associated with",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CurrentUserOrganizationDto"
            }
          }
        },
        "required": [
          "id",
          "email",
          "name",
          "email_verified",
          "currentOrgId",
          "organizations"
        ]
      },
      "CreateOrganizationDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "display_name": {
            "type": "string"
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {}
          },
          "branding": {
            "type": "object",
            "properties": {
              "logo_url": {
                "type": "string"
              },
              "colors": {
                "type": "object",
                "properties": {
                  "primary": {
                    "type": "string"
                  },
                  "page_background": {
                    "type": "string"
                  }
                },
                "required": [
                  "primary",
                  "page_background"
                ]
              }
            }
          }
        },
        "required": [
          "name",
          "display_name"
        ]
      },
      "Error": {
        "type": "object",
        "properties": {}
      },
      "OutputDto": {
        "type": "object",
        "properties": {
          "statusCode": {
            "type": "number",
            "description": "HTTP status code of the response"
          },
          "message": {
            "type": "string",
            "description": "Message describing the response status"
          },
          "data": {
            "type": "object",
            "description": "Data associated with the response"
          },
          "error": {
            "description": "Error or list of errors associated with the response",
            "allOf": [
              {
                "$ref": "#/components/schemas/Error"
              }
            ]
          }
        },
        "required": [
          "statusCode"
        ]
      },
      "CreateOrganizationInviteDto": {
        "type": "object",
        "properties": {
          "emails": {
            "type": "array",
            "minItems": 1,
            "maxItems": 10,
            "items": {
              "type": "string",
              "format": "email"
            }
          },
          "connection": {
            "type": "string",
            "enum": [
              "Username-Password-Authentication",
              "google-oauth2",
              "windowslive"
            ]
          },
          "ttl_sec": {
            "type": "integer",
            "minimum": 0,
            "exclusiveMinimum": false,
            "maximum": 2592000,
            "exclusiveMaximum": false
          }
        },
        "required": [
          "emails"
        ]
      },
      "Auth0UpdateUserOrgRolesDto": {
        "type": "object",
        "properties": {
          "role": {
            "type": "string",
            "enum": [
              "org_admin",
              "org_user"
            ]
          }
        },
        "required": [
          "role"
        ]
      },
      "DeleteOrganizationMembersDto": {
        "type": "object",
        "properties": {
          "membersIds": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "membersIds"
        ]
      },
      "Auth0UpdateUserDto": {
        "type": "object",
        "properties": {
          "email_verified": {
            "type": "boolean"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "user_metadata": {
            "type": "object",
            "additionalProperties": {}
          },
          "app_metadata": {
            "type": "object",
            "additionalProperties": {}
          },
          "name": {
            "type": "string"
          },
          "nickname": {
            "type": "string"
          },
          "picture": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "UpdateOrganizationDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "display_name": {
            "type": "string"
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {}
          },
          "branding": {
            "type": "object",
            "properties": {
              "logo_url": {
                "type": "string"
              },
              "colors": {
                "type": "object",
                "properties": {
                  "primary": {
                    "type": "string"
                  },
                  "page_background": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "UpdateUserSettingsDto": {
        "type": "object",
        "properties": {
          "notifications": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "flags": {
            "type": "object",
            "properties": {
              "generalFlags": {
                "type": "object",
                "properties": {
                  "appTheme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ]
                  },
                  "region": {
                    "type": "string"
                  }
                }
              },
              "customFlags": {
                "type": "object",
                "properties": {
                  "workflowTableFilters": {
                    "type": "object",
                    "additionalProperties": {}
                  }
                }
              }
            }
          }
        }
      },
      "OrgFossidKbConnectionResponseWithTypeDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique identifier for the connection"
          },
          "organizationId": {
            "type": "string",
            "description": "Organization ID"
          },
          "name": {
            "type": "string",
            "description": "Connection name"
          },
          "description": {
            "type": "object",
            "description": "Connection description",
            "nullable": true
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "inactive",
              "pending",
              "error"
            ],
            "description": "Connection status"
          },
          "connectionType": {
            "type": "string",
            "enum": [
              "fossid"
            ],
            "description": "Connection type"
          },
          "isActive": {
            "type": "boolean",
            "description": "Whether the connection is active"
          },
          "isDefault": {
            "type": "boolean",
            "description": "Whether this is the default connection for its FossID type"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string",
            "description": "Creation timestamp"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string",
            "description": "Last update timestamp"
          },
          "type": {
            "type": "string",
            "enum": [
              "fossid-kb"
            ],
            "example": "fossid-kb",
            "description": "FossID connection subtype"
          },
          "host": {
            "type": "string",
            "description": "FossID server host URL"
          },
          "token": {
            "type": "string",
            "description": "FossID API token (masked)"
          }
        },
        "required": [
          "id",
          "organizationId",
          "name",
          "status",
          "connectionType",
          "isActive",
          "isDefault",
          "createdAt",
          "updatedAt",
          "type",
          "host",
          "token"
        ]
      },
      "OrgFossidWorkbenchConnectionResponseWithTypeDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique identifier for the connection"
          },
          "organizationId": {
            "type": "string",
            "description": "Organization ID"
          },
          "name": {
            "type": "string",
            "description": "Connection name"
          },
          "description": {
            "type": "object",
            "description": "Connection description",
            "nullable": true
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "inactive",
              "pending",
              "error"
            ],
            "description": "Connection status"
          },
          "connectionType": {
            "type": "string",
            "enum": [
              "fossid"
            ],
            "description": "Connection type"
          },
          "isActive": {
            "type": "boolean",
            "description": "Whether the connection is active"
          },
          "isDefault": {
            "type": "boolean",
            "description": "Whether this is the default connection for its FossID type"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string",
            "description": "Creation timestamp"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string",
            "description": "Last update timestamp"
          },
          "type": {
            "type": "string",
            "enum": [
              "fossid-workbench"
            ],
            "example": "fossid-workbench",
            "description": "FossID connection subtype"
          },
          "host": {
            "type": "string",
            "description": "FossID Workbench server URL"
          },
          "username": {
            "type": "string",
            "description": "FossID Workbench username"
          },
          "apiKey": {
            "type": "string",
            "description": "FossID Workbench API key (masked)"
          }
        },
        "required": [
          "id",
          "organizationId",
          "name",
          "status",
          "connectionType",
          "isActive",
          "isDefault",
          "createdAt",
          "updatedAt",
          "type",
          "host",
          "username",
          "apiKey"
        ]
      },
      "OrgDatabaseConnectionResponseDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique identifier for the connection"
          },
          "organizationId": {
            "type": "string",
            "description": "Organization ID"
          },
          "name": {
            "type": "string",
            "description": "Connection name"
          },
          "description": {
            "type": "object",
            "description": "Connection description",
            "nullable": true
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "inactive",
              "pending",
              "error"
            ],
            "description": "Connection status"
          },
          "connectionType": {
            "type": "string",
            "enum": [
              "database",
              "storage",
              "fossid"
            ],
            "description": "Connection type"
          },
          "type": {
            "type": "string",
            "enum": [
              "postgresql"
            ],
            "description": "Database type"
          },
          "url": {
            "type": "string",
            "description": "Database connection URL (password masked)"
          },
          "host": {
            "type": "string",
            "description": "Database host"
          },
          "port": {
            "type": "number",
            "description": "Database port"
          },
          "databaseName": {
            "type": "string",
            "description": "Database name"
          },
          "authenticationType": {
            "type": "string",
            "enum": [
              "username_password"
            ],
            "description": "Authentication type"
          },
          "authenticationConfig": {
            "type": "object",
            "description": "Authentication configuration (sensitive data masked)"
          },
          "connectionOptions": {
            "type": "object",
            "description": "Additional connection options",
            "nullable": true
          },
          "isActive": {
            "type": "boolean",
            "description": "Whether the connection is active"
          },
          "isDefault": {
            "type": "boolean",
            "description": "Whether this is the default database connection for the organization"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string",
            "description": "Creation timestamp"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string",
            "description": "Last update timestamp"
          }
        },
        "required": [
          "id",
          "organizationId",
          "name",
          "status",
          "connectionType",
          "type",
          "url",
          "host",
          "port",
          "databaseName",
          "authenticationType",
          "authenticationConfig",
          "isActive",
          "isDefault",
          "createdAt",
          "updatedAt"
        ]
      },
      "OrgStorageConnectionResponseDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique identifier for the connection"
          },
          "organizationId": {
            "type": "string",
            "description": "Organization ID"
          },
          "name": {
            "type": "string",
            "description": "Connection name"
          },
          "description": {
            "type": "object",
            "description": "Connection description",
            "nullable": true
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "inactive",
              "pending",
              "error"
            ],
            "description": "Connection status"
          },
          "connectionType": {
            "type": "string",
            "enum": [
              "database",
              "storage",
              "fossid"
            ],
            "description": "Connection type"
          },
          "type": {
            "type": "string",
            "enum": [
              "s3",
              "azure-blob",
              "google-cloud-storage",
              "minio"
            ],
            "description": "Storage type"
          },
          "config": {
            "type": "object",
            "description": "Storage configuration (sensitive data masked)"
          },
          "isActive": {
            "type": "boolean",
            "description": "Whether the connection is active"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string",
            "description": "Creation timestamp"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string",
            "description": "Last update timestamp"
          }
        },
        "required": [
          "id",
          "organizationId",
          "name",
          "status",
          "connectionType",
          "type",
          "config",
          "isActive",
          "createdAt",
          "updatedAt"
        ]
      },
      "GetAllConnectionsResponseDto": {
        "type": "object",
        "properties": {
          "databases": {
            "description": "Array of database connections",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OrgDatabaseConnectionResponseDto"
            }
          },
          "storages": {
            "description": "Array of storage connections",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OrgStorageConnectionResponseDto"
            }
          },
          "fossid": {
            "type": "array",
            "description": "Array of FossID connections",
            "items": {
              "oneOf": [
                {
                  "$ref": "#/components/schemas/OrgFossidKbConnectionResponseWithTypeDto"
                },
                {
                  "$ref": "#/components/schemas/OrgFossidWorkbenchConnectionResponseWithTypeDto"
                }
              ],
              "discriminator": {
                "propertyName": "type"
              }
            }
          }
        },
        "required": [
          "databases",
          "storages",
          "fossid"
        ]
      },
      "CreateOrgDatabaseExampleDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Database connection name",
            "example": "Production Database"
          },
          "description": {
            "type": "object",
            "description": "Database connection description",
            "example": "Main production database for customer data"
          },
          "host": {
            "type": "string",
            "description": "Database host",
            "example": "localhost"
          },
          "port": {
            "type": "number",
            "description": "Database port",
            "example": 5432
          },
          "databaseName": {
            "type": "string",
            "description": "Database name",
            "example": "my_database"
          },
          "authenticationType": {
            "type": "string",
            "description": "Authentication type for the database connection",
            "enum": [
              "username_password"
            ],
            "example": "username_password"
          },
          "authenticationConfig": {
            "description": "Authentication configuration based on the authentication type",
            "example": {
              "type": "username_password",
              "username": "db_user",
              "password": "secure_password_123"
            },
            "oneOf": [
              {
                "description": "Username/Password authentication",
                "example": {
                  "type": "username_password",
                  "username": "db_user",
                  "password": "secure_password_123"
                }
              },
              {
                "description": "Token authentication",
                "example": {
                  "type": "token",
                  "token": "your_access_token_here",
                  "tokenType": "Bearer"
                }
              },
              {
                "description": "API Key authentication",
                "example": {
                  "type": "api_key",
                  "apiKey": "your_api_key_here",
                  "keyLocation": "header",
                  "keyName": "X-API-Key"
                }
              },
              {
                "description": "No authentication",
                "example": {
                  "type": "none"
                }
              }
            ]
          },
          "type": {
            "type": "string",
            "description": "Database type",
            "enum": [
              "postgresql"
            ],
            "example": "postgresql"
          },
          "connectionOptions": {
            "description": "Additional connection options (type-specific)",
            "example": {
              "ssl": true,
              "timeout": 30000,
              "applicationName": "MyApp"
            },
            "oneOf": [
              {
                "description": "PostgreSQL connection options",
                "example": {
                  "ssl": true,
                  "timeout": 30000,
                  "applicationName": "MyApp",
                  "maxConnections": 10
                }
              },
              {
                "description": "MongoDB connection options",
                "example": {
                  "ssl": true,
                  "timeout": 30000,
                  "authSource": "admin",
                  "maxPoolSize": 10
                }
              }
            ]
          },
          "isActive": {
            "type": "boolean",
            "description": "Whether the database connection is active",
            "example": true,
            "default": true
          }
        },
        "required": [
          "name",
          "host",
          "port",
          "databaseName",
          "authenticationType",
          "authenticationConfig",
          "type"
        ]
      },
      "OrgDatabaseResponseDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Database connection ID",
            "example": "123e4567-e89b-12d3-a456-426614174000"
          },
          "organizationId": {
            "type": "string",
            "description": "Organization ID",
            "example": "org-123e4567-e89b-12d3-a456-426614174000"
          },
          "name": {
            "type": "string",
            "description": "Database connection name",
            "example": "Production Database"
          },
          "description": {
            "type": "object",
            "description": "Database connection description",
            "example": "Main production database for customer data"
          },
          "url": {
            "type": "string",
            "description": "Database connection URL (password masked)",
            "example": "postgresql://user:***@localhost:5432/mydb"
          },
          "host": {
            "type": "string",
            "description": "Database host",
            "example": "localhost"
          },
          "port": {
            "type": "number",
            "description": "Database port",
            "example": 5432
          },
          "databaseName": {
            "type": "string",
            "description": "Database name",
            "example": "my_database"
          },
          "authenticationType": {
            "type": "string",
            "description": "Authentication type",
            "enum": [
              "username_password"
            ],
            "example": "username_password"
          },
          "authenticationConfig": {
            "type": "object",
            "description": "Authentication configuration (sensitive fields masked)",
            "example": {
              "type": "username_password",
              "username": "db_user",
              "password": "***"
            }
          },
          "type": {
            "type": "string",
            "description": "Database type",
            "enum": [
              "postgresql"
            ],
            "example": "postgresql"
          },
          "connectionOptions": {
            "type": "object",
            "description": "Additional connection options (type-specific)",
            "example": {
              "ssl": true,
              "timeout": 30000,
              "applicationName": "MyApp"
            }
          },
          "isActive": {
            "type": "boolean",
            "description": "Whether the database connection is active",
            "example": true
          },
          "isDefault": {
            "type": "boolean",
            "description": "Whether this is the default database connection for the organization",
            "example": false
          },
          "createdAt": {
            "format": "date-time",
            "type": "string",
            "description": "Creation timestamp",
            "example": "2024-01-01T00:00:00.000Z"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string",
            "description": "Last update timestamp",
            "example": "2024-01-01T00:00:00.000Z"
          }
        },
        "required": [
          "id",
          "organizationId",
          "name",
          "url",
          "host",
          "port",
          "databaseName",
          "authenticationType",
          "authenticationConfig",
          "type",
          "isActive",
          "isDefault",
          "createdAt",
          "updatedAt"
        ]
      },
      "UpdateOrgDatabaseDto": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "minLength": 1,
                "maxLength": 255
              },
              "description": {
                "type": "string",
                "maxLength": 1000,
                "nullable": true
              },
              "host": {
                "type": "string",
                "minLength": 1,
                "maxLength": 255
              },
              "port": {
                "type": "integer",
                "minimum": 1,
                "exclusiveMinimum": false,
                "maximum": 65535,
                "exclusiveMaximum": false
              },
              "databaseName": {
                "type": "string",
                "minLength": 1,
                "maxLength": 255
              },
              "authenticationType": {
                "type": "string",
                "enum": [
                  "username_password"
                ],
                "x-enumNames": [
                  "USERNAME_PASSWORD"
                ]
              },
              "authenticationConfig": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "enum": [
                          "username_password"
                        ]
                      },
                      "username": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 255
                      },
                      "password": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 500
                      }
                    },
                    "required": [
                      "type"
                    ]
                  }
                ]
              },
              "isActive": {
                "type": "boolean"
              },
              "isDefault": {
                "type": "boolean"
              },
              "type": {
                "type": "string",
                "enum": [
                  "postgresql"
                ]
              },
              "connectionOptions": {
                "type": "object",
                "properties": {
                  "timeout": {
                    "type": "integer",
                    "minimum": 0,
                    "exclusiveMinimum": false
                  },
                  "ssl": {
                    "type": "boolean"
                  },
                  "applicationName": {
                    "type": "string",
                    "maxLength": 255
                  },
                  "maxConnections": {
                    "type": "integer",
                    "minimum": 1,
                    "exclusiveMinimum": false,
                    "maximum": 1000,
                    "exclusiveMaximum": false
                  },
                  "idleTimeout": {
                    "type": "integer",
                    "minimum": 0,
                    "exclusiveMinimum": false
                  },
                  "connectionTimeout": {
                    "type": "integer",
                    "minimum": 0,
                    "exclusiveMinimum": false
                  },
                  "keepAlive": {
                    "type": "boolean"
                  },
                  "keepAliveInitialDelay": {
                    "type": "integer",
                    "minimum": 0,
                    "exclusiveMinimum": false
                  }
                },
                "nullable": true
              }
            },
            "required": [
              "type"
            ]
          }
        ]
      },
      "OrgFossidKbConnectionResponseDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "FossID connection ID",
            "example": "123e4567-e89b-12d3-a456-426614174000"
          },
          "organizationId": {
            "type": "string",
            "description": "Organization ID",
            "example": "org-123e4567-e89b-12d3-a456-426614174000"
          },
          "name": {
            "type": "string",
            "description": "FossID connection name",
            "example": "Production FossID"
          },
          "description": {
            "type": "object",
            "description": "FossID connection description",
            "example": "Main production FossID instance"
          },
          "isActive": {
            "type": "boolean",
            "description": "Whether the FossID connection is active",
            "example": true
          },
          "isDefault": {
            "type": "boolean",
            "description": "Whether this is the default connection for its FossID type in the organization",
            "example": false
          },
          "createdAt": {
            "format": "date-time",
            "type": "string",
            "description": "Creation timestamp",
            "example": "2024-01-01T00:00:00.000Z"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string",
            "description": "Last update timestamp",
            "example": "2024-01-01T00:00:00.000Z"
          },
          "type": {
            "type": "string",
            "enum": [
              "fossid-kb"
            ],
            "example": "fossid-kb",
            "description": "FossID connection subtype"
          },
          "host": {
            "type": "string",
            "description": "FossID server host URL",
            "example": "https://fossid.example.com"
          },
          "token": {
            "type": "string",
            "description": "FossID API token (masked in response)",
            "example": "***"
          }
        },
        "required": [
          "id",
          "organizationId",
          "name",
          "isActive",
          "isDefault",
          "createdAt",
          "updatedAt",
          "type",
          "host",
          "token"
        ]
      },
      "OrgFossidWorkbenchConnectionResponseDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "FossID connection ID",
            "example": "123e4567-e89b-12d3-a456-426614174000"
          },
          "organizationId": {
            "type": "string",
            "description": "Organization ID",
            "example": "org-123e4567-e89b-12d3-a456-426614174000"
          },
          "name": {
            "type": "string",
            "description": "FossID connection name",
            "example": "Production FossID"
          },
          "description": {
            "type": "object",
            "description": "FossID connection description",
            "example": "Main production FossID instance"
          },
          "isActive": {
            "type": "boolean",
            "description": "Whether the FossID connection is active",
            "example": true
          },
          "isDefault": {
            "type": "boolean",
            "description": "Whether this is the default connection for its FossID type in the organization",
            "example": false
          },
          "createdAt": {
            "format": "date-time",
            "type": "string",
            "description": "Creation timestamp",
            "example": "2024-01-01T00:00:00.000Z"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string",
            "description": "Last update timestamp",
            "example": "2024-01-01T00:00:00.000Z"
          },
          "type": {
            "type": "string",
            "enum": [
              "fossid-workbench"
            ],
            "example": "fossid-workbench",
            "description": "FossID connection subtype"
          },
          "host": {
            "type": "string",
            "description": "FossID Workbench server URL",
            "example": "https://workbench.fossid.example.com"
          },
          "username": {
            "type": "string",
            "description": "FossID Workbench username",
            "example": "api-user"
          },
          "apiKey": {
            "type": "string",
            "description": "FossID Workbench API key (masked in response)",
            "example": "***"
          }
        },
        "required": [
          "id",
          "organizationId",
          "name",
          "isActive",
          "isDefault",
          "createdAt",
          "updatedAt",
          "type",
          "host",
          "username",
          "apiKey"
        ]
      },
      "CreateOrgFossidKbConnectionDto": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "fossid-kb"
            ],
            "example": "fossid-kb"
          },
          "name": {
            "type": "string",
            "description": "Connection name",
            "example": "Production FossID KB"
          },
          "description": {
            "type": "string",
            "description": "Connection description",
            "nullable": true,
            "example": "Main FossID KB instance"
          },
          "host": {
            "type": "string",
            "description": "FossID server host URL",
            "example": "https://fossid.example.com"
          },
          "token": {
            "type": "string",
            "description": "FossID API token",
            "example": "my-secret-token"
          },
          "isActive": {
            "type": "boolean",
            "description": "Whether the connection is active",
            "example": true
          }
        },
        "required": [
          "type",
          "name",
          "host",
          "token"
        ]
      },
      "CreateOrgFossidWorkbenchConnectionDto": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "fossid-workbench"
            ],
            "example": "fossid-workbench"
          },
          "name": {
            "type": "string",
            "description": "Connection name",
            "example": "Production FossID Workbench"
          },
          "description": {
            "type": "string",
            "description": "Connection description",
            "nullable": true,
            "example": "Main FossID Workbench instance"
          },
          "host": {
            "type": "string",
            "description": "FossID Workbench server URL",
            "example": "https://workbench.fossid.example.com"
          },
          "username": {
            "type": "string",
            "description": "FossID Workbench username",
            "example": "api-user"
          },
          "apiKey": {
            "type": "string",
            "description": "FossID Workbench API key",
            "example": "my-api-key"
          },
          "isActive": {
            "type": "boolean",
            "description": "Whether the connection is active",
            "example": true
          }
        },
        "required": [
          "type",
          "name",
          "host",
          "username",
          "apiKey"
        ]
      },
      "UpdateOrgFossidKbConnectionDto": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "fossid-kb"
            ],
            "example": "fossid-kb"
          },
          "name": {
            "type": "string",
            "description": "Connection name"
          },
          "description": {
            "type": "string",
            "description": "Connection description",
            "nullable": true
          },
          "host": {
            "type": "string",
            "description": "FossID server host URL"
          },
          "token": {
            "type": "string",
            "description": "FossID API token"
          },
          "isActive": {
            "type": "boolean",
            "description": "Whether the connection is active"
          }
        },
        "required": [
          "type"
        ]
      },
      "UpdateOrgFossidWorkbenchConnectionDto": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "fossid-workbench"
            ],
            "example": "fossid-workbench"
          },
          "name": {
            "type": "string",
            "description": "Connection name"
          },
          "description": {
            "type": "string",
            "description": "Connection description",
            "nullable": true
          },
          "host": {
            "type": "string",
            "description": "FossID Workbench server URL"
          },
          "username": {
            "type": "string",
            "description": "FossID Workbench username"
          },
          "apiKey": {
            "type": "string",
            "description": "FossID Workbench API key"
          },
          "isActive": {
            "type": "boolean",
            "description": "Whether the connection is active"
          }
        },
        "required": [
          "type"
        ]
      },
      "WorkflowNodeParamDto": {
        "type": "object",
        "properties": {
          "paramId": {
            "type": "string",
            "description": "Parameter ID",
            "example": "inputFileId"
          },
          "value": {
            "type": "object",
            "description": "Parameter value",
            "example": "file-123"
          }
        },
        "required": [
          "paramId",
          "value"
        ]
      },
      "VisualMetadataDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Node ID",
            "example": "cdx-to-novum-infra-node"
          },
          "position": {
            "type": "object",
            "description": "Node position",
            "example": {
              "x": 100,
              "y": 200
            }
          },
          "data": {
            "type": "object",
            "description": "Node data",
            "example": {
              "label": "Read CycloneDX"
            }
          },
          "type": {
            "type": "string",
            "description": "Node type",
            "example": "default"
          }
        },
        "required": [
          "id",
          "position",
          "data",
          "type"
        ]
      },
      "WorkflowNodeDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Node ID",
            "example": "cdx-to-novum-infra-node"
          },
          "baseNodeId": {
            "type": "string",
            "description": "Base node ID",
            "example": "cdx-to-novum-infra-node"
          },
          "params": {
            "description": "Node parameters",
            "example": [
              {
                "paramId": "inputFileId",
                "value": "file-123"
              }
            ],
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkflowNodeParamDto"
            }
          },
          "visualMetadata": {
            "description": "Visual metadata for node positioning",
            "example": {
              "id": "cdx-to-novum-infra-node",
              "position": {
                "x": 100,
                "y": 200
              },
              "data": {
                "label": "Read CycloneDX"
              },
              "type": "default"
            },
            "allOf": [
              {
                "$ref": "#/components/schemas/VisualMetadataDto"
              }
            ]
          }
        },
        "required": [
          "id",
          "baseNodeId",
          "params",
          "visualMetadata"
        ]
      },
      "WorkflowEdgeDto": {
        "type": "object",
        "properties": {
          "source": {
            "type": "string",
            "description": "Source node ID",
            "example": "cdx-to-novum-infra-node"
          },
          "target": {
            "type": "string",
            "description": "Target node ID",
            "example": "analysis-create-pivot-table"
          },
          "id": {
            "type": "string",
            "description": "Edge ID",
            "example": "edge-1"
          }
        },
        "required": [
          "source",
          "target",
          "id"
        ]
      },
      "WorkflowMetadataDto": {
        "type": "object",
        "properties": {
          "currentVersion": {
            "type": "number",
            "description": "Current workflow version",
            "example": 1
          },
          "description": {
            "type": "string",
            "description": "Workflow description",
            "example": "Workflow for generating PDF reports from CycloneDX and SPDX data"
          }
        },
        "required": [
          "currentVersion",
          "description"
        ]
      },
      "CreateWorkflowApiExampleDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Workflow name",
            "example": "PDF Report Generation Workflow-7"
          },
          "nodes": {
            "description": "Workflow nodes",
            "example": [
              {
                "id": "cdx-to-novum-infra-node",
                "baseNodeId": "cdx-to-novum-infra-node",
                "params": [],
                "visualMetadata": {
                  "id": "cdx-to-novum-infra-node",
                  "position": {
                    "x": 100,
                    "y": 100
                  },
                  "data": {
                    "label": "Read CycloneDX"
                  },
                  "type": "input"
                }
              },
              {
                "id": "analysis-create-pivot-table",
                "baseNodeId": "analysis-create-pivot-table",
                "params": [
                  {
                    "paramId": "filter",
                    "value": "name"
                  },
                  {
                    "paramId": "columns",
                    "value": "name, userId, createdAt"
                  },
                  {
                    "paramId": "rows",
                    "value": "row1, row2"
                  },
                  {
                    "paramId": "values",
                    "value": "user, user-123, 12-20-2025"
                  }
                ],
                "visualMetadata": {
                  "id": "analysis-create-pivot-table",
                  "position": {
                    "x": 250,
                    "y": 200
                  },
                  "data": {
                    "label": "Create Pivot Table"
                  },
                  "type": "process"
                }
              },
              {
                "id": "spdx-to-novum-infra-node",
                "baseNodeId": "spdx-to-novum-infra-node",
                "params": [
                  {
                    "paramId": "spdx_version",
                    "value": "2.2"
                  }
                ],
                "visualMetadata": {
                  "id": "spdx-to-novum-infra-node",
                  "position": {
                    "x": 100,
                    "y": 300
                  },
                  "data": {
                    "label": "Read SPDX"
                  },
                  "type": "input"
                }
              },
              {
                "id": "transformation-jsonata",
                "baseNodeId": "transformation-jsonata",
                "params": [
                  {
                    "paramId": "jsonata_expression",
                    "value": "$.components.^(license.id = \"MIT\" or license.id = \"Apache-2.0\")"
                  }
                ],
                "visualMetadata": {
                  "id": "transformation-jsonata",
                  "position": {
                    "x": 400,
                    "y": 200
                  },
                  "data": {
                    "label": "Transform with JSONata"
                  },
                  "type": "process"
                }
              },
              {
                "id": "report-pdf",
                "baseNodeId": "report-pdf",
                "params": [
                  {
                    "paramId": "template",
                    "value": "template-123"
                  }
                ],
                "visualMetadata": {
                  "id": "report-pdf",
                  "position": {
                    "x": 550,
                    "y": 300
                  },
                  "data": {
                    "label": "Generate PDF Report"
                  },
                  "type": "output"
                }
              }
            ],
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkflowNodeDto"
            }
          },
          "edges": {
            "description": "Workflow edges",
            "example": [
              {
                "source": "cdx-to-novum-infra-node",
                "target": "analysis-create-pivot-table"
              },
              {
                "source": "spdx-to-novum-infra-node",
                "target": "analysis-create-pivot-table"
              },
              {
                "source": "analysis-create-pivot-table",
                "target": "transformation-jsonata"
              },
              {
                "id": "edge-5",
                "source": "transformation-jsonata",
                "target": "report-pdf"
              }
            ],
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkflowEdgeDto"
            }
          },
          "metadata": {
            "description": "Workflow metadata",
            "example": {
              "currentVersion": 1,
              "description": "Workflow for generating PDF reports from CycloneDX and SPDX data"
            },
            "allOf": [
              {
                "$ref": "#/components/schemas/WorkflowMetadataDto"
              }
            ]
          }
        },
        "required": [
          "name",
          "nodes",
          "edges",
          "metadata"
        ]
      },
      "ProfileWorkflowDto": {
        "type": "object",
        "properties": {
          "auth0Id": {
            "type": "string",
            "description": "Unique identifier for the profile"
          },
          "name": {
            "type": "string",
            "description": "Name of the profile"
          }
        },
        "required": [
          "auth0Id",
          "name"
        ]
      },
      "CreateWorkflowDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "nodes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "baseNodeId": {
                  "type": "string"
                },
                "params": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "paramId": {
                        "type": "string"
                      },
                      "value": {}
                    },
                    "required": [
                      "paramId",
                      "value"
                    ]
                  }
                },
                "isSuccessPathNode": {
                  "type": "boolean"
                },
                "visualMetadata": {}
              },
              "required": [
                "id",
                "baseNodeId"
              ]
            }
          },
          "edges": {
            "type": "array",
            "items": {}
          },
          "metadata": {
            "type": "object",
            "properties": {
              "currentVersion": {
                "type": "number"
              },
              "description": {
                "type": "string"
              }
            },
            "required": [
              "currentVersion"
            ]
          }
        },
        "required": [
          "name"
        ]
      },
      "GetWorkflowResDto": {
        "type": "object",
        "properties": {
          "allowedExternalEmails": {
            "description": "List of emails allowed to start the workflow",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "workflowNodes": {
            "description": "Workflow nodes",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkflowNodeDto"
            }
          },
          "id": {
            "type": "string",
            "description": "Unique identifier for the workflow"
          },
          "workflowGroupId": {
            "type": "string",
            "description": "Group identifier for the workflow"
          },
          "version": {
            "type": "number",
            "description": "Version of the workflow"
          },
          "name": {
            "type": "string",
            "description": "Name of the workflow"
          },
          "description": {
            "type": "object",
            "description": "Description of the workflow"
          },
          "orgId": {
            "type": "object",
            "description": "Organization ID associated with the workflow"
          },
          "modifiedBy": {
            "description": "Profile of the user who created the workflow",
            "allOf": [
              {
                "$ref": "#/components/schemas/ProfileWorkflowDto"
              }
            ]
          },
          "tokenGuest": {
            "type": "object",
            "description": "Guest token for external access"
          },
          "graphRepresentationBpmn": {
            "description": "Graph representation in BPMN format",
            "allOf": [
              {
                "$ref": "#/components/schemas/CreateWorkflowDto"
              }
            ]
          },
          "status": {
            "type": "string",
            "description": "Current status of the workflow"
          },
          "hasManyFailedInstances": {
            "type": "object",
            "description": "Indicates if the workflow has multiple failed instances"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string",
            "description": "Timestamp when the workflow was created"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string",
            "description": "Timestamp when the workflow was last updated"
          },
          "isValid": {
            "type": "boolean",
            "description": "Indicates if the workflow is valid and if it can be executed"
          },
          "validationErrors": {
            "description": "Array of validation error messages if the workflow is invalid",
            "example": [
              "Node not found: node-123",
              "Invalid parameter configuration"
            ],
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "deletedAt": {
            "type": "object",
            "description": "Timestamp when the workflow was deleted (if applicable)"
          },
          "executionsCount": {
            "type": "number",
            "description": "Number of executions recorded for this workflow version",
            "example": 0
          },
          "startDetails": {
            "type": "object",
            "description": "Configuration for workflow start capabilities including imports and database read triggers",
            "additionalProperties": false,
            "example": {
              "hasLocalImport": true,
              "hasRemoteImport": false,
              "hasDatabaseReadTrigger": false,
              "localImportURL": "/v1/workflows/{id}/start-local"
            }
          }
        },
        "required": [
          "workflowNodes",
          "id",
          "workflowGroupId",
          "version",
          "name",
          "createdAt",
          "updatedAt",
          "startDetails"
        ]
      },
      "GetWorkflowsResDto": {
        "type": "object",
        "properties": {
          "workflowsNumber": {
            "type": "number"
          },
          "workflows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetWorkflowResDto"
            }
          }
        },
        "required": [
          "workflowsNumber",
          "workflows"
        ]
      },
      "UpdateWorkflowDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "nodes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "baseNodeId": {
                  "type": "string"
                },
                "params": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "paramId": {
                        "type": "string"
                      },
                      "value": {}
                    },
                    "required": [
                      "paramId",
                      "value"
                    ]
                  }
                },
                "isSuccessPathNode": {
                  "type": "boolean"
                },
                "visualMetadata": {}
              },
              "required": [
                "id",
                "baseNodeId"
              ]
            }
          },
          "edges": {
            "type": "array",
            "items": {}
          },
          "metadata": {
            "type": "object",
            "properties": {
              "currentVersion": {
                "type": "number"
              },
              "description": {
                "type": "string"
              }
            },
            "required": [
              "currentVersion"
            ]
          }
        },
        "required": [
          "name"
        ]
      },
      "UpdateWorkflowResDto": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string"
          },
          "workflow": {
            "$ref": "#/components/schemas/GetWorkflowResDto"
          }
        },
        "required": [
          "message",
          "workflow"
        ]
      },
      "UpdateWorkflowMetadataDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "description": {
            "type": "string",
            "maxLength": 1000
          }
        }
      },
      "UpdateWorkflowStatusDto": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "PUBLISHED",
              "STOPPED"
            ]
          }
        },
        "required": [
          "status"
        ]
      },
      "EdgeDto": {
        "type": "object",
        "properties": {
          "source": {
            "type": "string",
            "description": "Source node ID",
            "example": "cdx-to-novum-infra-node"
          },
          "target": {
            "type": "string",
            "description": "Target node ID",
            "example": "analysis-create-pivot-table"
          }
        },
        "required": [
          "source",
          "target"
        ]
      },
      "NodeDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Node ID",
            "example": "cdx-to-novum-infra-node"
          },
          "baseNodeId": {
            "type": "string",
            "description": "Base node ID",
            "example": "cdx-to-novum-infra-node"
          }
        },
        "required": [
          "id",
          "baseNodeId"
        ]
      },
      "CheckWorkflowFlowDto": {
        "type": "object",
        "properties": {
          "edges": {
            "description": "Array of edges connecting nodes",
            "example": [
              {
                "source": "cdx-to-novum-infra-node",
                "target": "analysis-create-pivot-table"
              },
              {
                "source": "spdx-to-novum-infra-node",
                "target": "analysis-create-pivot-table"
              },
              {
                "source": "analysis-create-pivot-table",
                "target": "transformation-jsonata"
              },
              {
                "source": "transformation-jsonata",
                "target": "cdx-to-novum-infra-node(2)"
              },
              {
                "source": "cdx-to-novum-infra-node(2)",
                "target": "report-pdf"
              }
            ],
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EdgeDto"
            }
          },
          "nodes": {
            "description": "Array of workflow nodes",
            "example": [
              {
                "id": "cdx-to-novum-infra-node",
                "baseNodeId": "cdx-to-novum-infra-node"
              },
              {
                "id": "analysis-create-pivot-table",
                "baseNodeId": "analysis-create-pivot-table"
              },
              {
                "id": "spdx-to-novum-infra-node",
                "baseNodeId": "spdx-to-novum-infra-node"
              },
              {
                "id": "transformation-jsonata",
                "baseNodeId": "transformation-jsonata"
              },
              {
                "id": "report-pdf",
                "baseNodeId": "report-pdf"
              },
              {
                "id": "cdx-to-novum-infra-node(2)",
                "baseNodeId": "cdx-to-novum-infra-node"
              }
            ],
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NodeDto"
            }
          }
        },
        "required": [
          "edges",
          "nodes"
        ]
      },
      "UploadWorkflowFilesDto": {
        "type": "object",
        "properties": {
          "files": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "binary"
            },
            "description": "Files to upload for workflow execution"
          },
          "metadata": {
            "type": "string",
            "description": "JSON string containing metadata for each file",
            "example": "[{\"nodeId\":\"node-123\",\"fileName\":\"document.pdf\"}]"
          },
          "workflowId": {
            "type": "string",
            "format": "uuid",
            "description": "UUID of the workflow to execute",
            "example": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
          },
          "uploadingEmail": {
            "type": "string",
            "format": "email",
            "description": "Email address of the person uploading the files",
            "example": "user@example.com"
          }
        },
        "required": [
          "files",
          "metadata",
          "workflowId",
          "uploadingEmail"
        ]
      },
      "FileMetadataDto": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "string",
            "description": "Unique identifier for the file",
            "example": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
          },
          "nodeId": {
            "type": "string",
            "description": "Workflow node identifier",
            "example": "node-123"
          },
          "fileName": {
            "type": "string",
            "description": "Original filename",
            "example": "document.pdf"
          }
        },
        "required": [
          "fileId",
          "nodeId",
          "fileName"
        ]
      },
      "UploadedFileDto": {
        "type": "object",
        "properties": {
          "file": {
            "type": "object",
            "description": "Uploaded file information"
          },
          "metadata": {
            "description": "Associated metadata for the file",
            "allOf": [
              {
                "$ref": "#/components/schemas/FileMetadataDto"
              }
            ]
          }
        },
        "required": [
          "file",
          "metadata"
        ]
      },
      "StartWorkflowExecutionUploadResponseDto": {
        "type": "object",
        "properties": {
          "uploaded": {
            "description": "Array of uploaded files with their metadata",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UploadedFileDto"
            }
          },
          "workflowId": {
            "type": "string",
            "description": "UUID of the workflow",
            "example": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
          },
          "uploadingEmail": {
            "type": "string",
            "description": "Email address of the uploader",
            "example": "user@example.com"
          }
        },
        "required": [
          "uploaded",
          "workflowId",
          "uploadingEmail"
        ]
      },
      "GetWorkflowStartDetailsResDto": {
        "type": "object",
        "properties": {
          "workflowId": {
            "type": "string",
            "description": "Workflow ID",
            "example": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
          },
          "workflowName": {
            "type": "string",
            "description": "Workflow display name",
            "example": "SBOM Validation Pipeline"
          },
          "startingNodes": {
            "description": "Array of initial workflow nodes that can start the workflow",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "type": "string",
            "description": "Current status of the workflow",
            "enum": [
              "DRAFT",
              "PUBLISHED",
              "STOPPED"
            ],
            "example": "PUBLISHED"
          },
          "startDetails": {
            "type": "object",
            "description": "Configuration for workflow start capabilities including imports, database read triggers, and GitHub app triggers",
            "additionalProperties": false,
            "example": {
              "hasLocalImport": true,
              "hasRemoteImport": false,
              "hasDatabaseReadTrigger": false,
              "hasGithubTrigger": false,
              "localImportURL": "/v1/workflows/{id}/start-local"
            }
          },
          "organization": {
            "type": "object",
            "description": "Organization details from Auth0 (display name, branding) when workflow belongs to an org",
            "nullable": true
          }
        },
        "required": [
          "workflowId",
          "workflowName",
          "startingNodes",
          "status",
          "startDetails"
        ]
      },
      "WorkflowExecutionNodeInfoDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The unique identifier of the workflow execution node",
            "example": "123e4567-e89b-12d3-a456-426614174000"
          },
          "workflowNodeId": {
            "type": "string",
            "description": "The ID of the workflow node this execution node represents",
            "example": "123e4567-e89b-12d3-a456-426614174001"
          },
          "status": {
            "type": "string",
            "description": "The current status of the workflow execution node",
            "enum": [
              "pending",
              "in_progress",
              "awaiting_approval",
              "completed",
              "approved",
              "failed",
              "rejected",
              "fail_path_handled",
              "fail_path_ignored"
            ],
            "example": "completed"
          },
          "tempDataStartUrl": {
            "type": "string",
            "description": "Temporary data URL at the start of execution",
            "example": "https://example.com/temp-data-start"
          },
          "tempDataEndUrl": {
            "type": "string",
            "description": "Temporary data URL at the end of execution",
            "example": "https://example.com/temp-data-end"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string",
            "description": "When the workflow execution node was created",
            "example": "2023-01-01T00:00:00.000Z"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string",
            "description": "When the workflow execution node was last updated",
            "example": "2023-01-01T00:00:00.000Z"
          }
        },
        "required": [
          "id",
          "workflowNodeId",
          "status",
          "createdAt",
          "updatedAt"
        ]
      },
      "WorkflowExecutionInfoDto": {
        "type": "object",
        "properties": {
          "progress": {
            "type": "number",
            "description": "The progress of the workflow execution as a percentage (0-100)",
            "example": 67
          },
          "id": {
            "type": "string",
            "description": "The unique identifier of the workflow execution",
            "example": "123e4567-e89b-12d3-a456-426614174000"
          },
          "workflowId": {
            "type": "string",
            "description": "The ID of the workflow this execution belongs to",
            "example": "123e4567-e89b-12d3-a456-426614174001"
          },
          "inputFileNames": {
            "description": "Original file name(s) uploaded when the execution was started",
            "example": [
              "my-sbom.json"
            ],
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "inputFiles": {
            "type": "array",
            "description": "Structured metadata for each uploaded input file",
            "items": {
              "type": "object",
              "properties": {
                "fileName": {
                  "type": "string"
                },
                "startingWorkflowNodeId": {
                  "type": "string"
                },
                "startingNodeLabel": {
                  "type": "string"
                },
                "nextNodeNames": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "triggeredById": {
            "type": "object",
            "description": "The ID of the user who triggered this execution",
            "example": "123e4567-e89b-12d3-a456-426614174002"
          },
          "triggeredByEmail": {
            "type": "string",
            "description": "The email of the user who triggered this execution",
            "example": "user@example.com"
          },
          "startedAt": {
            "format": "date-time",
            "type": "string",
            "description": "When the workflow execution started",
            "example": "2023-01-01T00:00:00.000Z"
          },
          "completedAt": {
            "type": "object",
            "description": "When the workflow execution completed",
            "example": "2023-01-01T01:00:00.000Z"
          },
          "durationMs": {
            "type": "object",
            "description": "Execution wall time in ms from startedAt to completedAt when finished (stored generated column)",
            "nullable": true,
            "example": 7515
          },
          "errors": {
            "description": "Array of error messages if the execution failed",
            "example": [
              "Error processing file",
              "Connection timeout"
            ],
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "executionNodes": {
            "description": "The execution nodes for this workflow execution",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkflowExecutionNodeInfoDto"
            }
          },
          "status": {
            "type": "string",
            "description": "The current status of the workflow execution",
            "enum": [
              "pending",
              "in_progress",
              "pending_approval",
              "completed",
              "partially_completed",
              "error_handled",
              "failed",
              "rejected"
            ],
            "example": "completed"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string",
            "description": "When the workflow execution was created",
            "example": "2023-01-01T00:00:00.000Z"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string",
            "description": "When the workflow execution was last updated",
            "example": "2023-01-01T00:00:00.000Z"
          }
        },
        "required": [
          "progress",
          "id",
          "workflowId",
          "triggeredByEmail",
          "startedAt",
          "executionNodes",
          "status",
          "createdAt",
          "updatedAt"
        ]
      },
      "GetWorkflowExecutionsResDto": {
        "type": "object",
        "properties": {
          "workflowId": {
            "type": "string",
            "description": "The ID of the workflow",
            "example": "123e4567-e89b-12d3-a456-426614174000"
          },
          "executionsCount": {
            "type": "number",
            "description": "The total number of workflow executions",
            "example": 5
          },
          "executions": {
            "description": "Array of workflow executions",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkflowExecutionInfoDto"
            }
          }
        },
        "required": [
          "workflowId",
          "executionsCount",
          "executions"
        ]
      },
      "AnnotationDto": {
        "type": "object",
        "properties": {
          "comment": {
            "type": "string",
            "description": "Free-text comment from the reviewer"
          }
        },
        "required": [
          "comment"
        ]
      },
      "SubmitReviewDto": {
        "type": "object",
        "properties": {
          "annotations": {
            "description": "Document-level annotations to append to the SBOM",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AnnotationDto"
            }
          }
        }
      },
      "WorkflowExecutionPreviousNodeDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The unique identifier of the previous workflow execution node",
            "example": "123e4567-e89b-12d3-a456-426614174000"
          },
          "workflowNodeId": {
            "type": "string",
            "description": "The ID of the workflow node this previous execution node represents",
            "example": "123e4567-e89b-12d3-a456-426614174001"
          },
          "nodeName": {
            "type": "string",
            "description": "The name of the previous node",
            "example": "CDX to Novum Converter"
          },
          "status": {
            "type": "string",
            "description": "The current status of the previous workflow execution node",
            "enum": [
              "pending",
              "in_progress",
              "awaiting_approval",
              "completed",
              "approved",
              "failed",
              "rejected",
              "fail_path_handled",
              "fail_path_ignored"
            ],
            "example": "completed"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string",
            "description": "When the previous workflow execution node was last updated",
            "example": "2023-01-01T00:00:00.000Z"
          }
        },
        "required": [
          "id",
          "workflowNodeId",
          "nodeName",
          "status",
          "updatedAt"
        ]
      },
      "WorkflowExecutionErrorEntryDto": {
        "type": "object",
        "properties": {
          "errorMessage": {
            "type": "object",
            "description": "Human-readable failure description (typically `Error.message`).",
            "nullable": true,
            "example": "External node responded with HTTP 500: timeout exceeded"
          },
          "errorCode": {
            "type": "object",
            "description": "Stable, machine-readable failure category for filtering / metrics.",
            "nullable": true,
            "example": "external_node_timeout"
          },
          "errorDetails": {
            "type": "object",
            "description": "Structured failure payload (stack traces, response bodies, validation issues).",
            "nullable": true,
            "additionalProperties": true,
            "example": {
              "httpStatus": 500,
              "responseBody": {
                "message": "Upstream timeout"
              }
            }
          },
          "occurredAt": {
            "type": "object",
            "description": "Wall-clock time this error was recorded.",
            "nullable": true,
            "example": "2023-01-01T00:00:00.000Z"
          }
        }
      },
      "WorkflowExecutionNodeRunInfoDto": {
        "type": "object",
        "properties": {
          "runId": {
            "type": "string",
            "example": "123e4567-e89b-12d3-a456-426614174000"
          },
          "triggeredByDependencyId": {
            "type": "object",
            "nullable": true
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "in_progress",
              "awaiting_approval",
              "completed",
              "approved",
              "failed",
              "rejected",
              "fail_path_handled",
              "fail_path_ignored"
            ]
          },
          "inputFilePath": {
            "type": "object",
            "nullable": true
          },
          "outputFilePath": {
            "type": "object",
            "nullable": true
          },
          "previousNodes": {
            "description": "Immediate predecessor execution node for this run (from triggeredByDependencyId). Usually one entry.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkflowExecutionPreviousNodeDto"
            }
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "executionDurationMs": {
            "type": "object",
            "description": "Run duration in milliseconds when finished; null while running or if unknown",
            "nullable": true,
            "example": 1250
          },
          "pipelineDurationMs": {
            "type": "object",
            "description": "Wall time from path root to this run finishing (ms)",
            "nullable": true,
            "example": 68412
          },
          "errors": {
            "description": "Append-only failure history for this run. Empty array when the run never failed. The most recent entry is the last element.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkflowExecutionErrorEntryDto"
            }
          }
        },
        "required": [
          "runId",
          "status",
          "createdAt",
          "errors"
        ]
      },
      "WorkflowExecutionNodeDetailDto": {
        "type": "object",
        "properties": {
          "workflowExecutionNodeId": {
            "type": "string"
          },
          "workflowNodeId": {
            "type": "string"
          },
          "nodeName": {
            "type": "string"
          },
          "nodeType": {
            "type": "string"
          },
          "order": {
            "type": "object",
            "nullable": true
          },
          "isSuccessPathNode": {
            "type": "boolean"
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "in_progress",
              "awaiting_approval",
              "completed",
              "approved",
              "failed",
              "rejected",
              "fail_path_handled",
              "fail_path_ignored"
            ]
          },
          "inputFilePath": {
            "type": "object",
            "nullable": true
          },
          "outputFilePath": {
            "type": "object",
            "nullable": true
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "runs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkflowExecutionNodeRunInfoDto"
            }
          },
          "executionDurationMs": {
            "type": "object",
            "description": "Node execution duration in ms when start/finish were recorded",
            "nullable": true,
            "example": 3400
          },
          "pipelineDurationMs": {
            "type": "object",
            "description": "Wall time from path root to this node finishing (ms)",
            "nullable": true,
            "example": 68412
          },
          "previousNodeIds": {
            "description": "Static graph predecessors for this node (workflow execution node ids). Mirrors the workflow node's prevDependenciesIds and lets clients walk the real DAG (including review gates and pending branches) regardless of run-level data flow.",
            "example": [
              "123e4567-e89b-12d3-a456-426614174000"
            ],
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "mergeAllInputs": {
            "type": "boolean",
            "description": "True when the node merges all inputs into a single combined output in one run (e.g. Merge Data). Such nodes have no per-trigger runs and must be shown as one output, not one per input.",
            "example": true
          },
          "errors": {
            "description": "Append-only failure history for this node. Includes errors mirrored from runs so consumers do not have to walk every run. Empty array when the node never failed.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkflowExecutionErrorEntryDto"
            }
          }
        },
        "required": [
          "workflowExecutionNodeId",
          "workflowNodeId",
          "nodeName",
          "nodeType",
          "order",
          "isSuccessPathNode",
          "status",
          "createdAt",
          "updatedAt",
          "runs",
          "previousNodeIds",
          "errors"
        ]
      },
      "GetWorkflowExecutionOutputNodesResDto": {
        "type": "object",
        "properties": {
          "executionId": {
            "type": "string",
            "description": "The unique identifier of the workflow execution",
            "example": "123e4567-e89b-12d3-a456-426614174000"
          },
          "outputNodesCount": {
            "type": "number",
            "description": "The number of output nodes",
            "example": 3
          },
          "outputNodes": {
            "type": "array",
            "description": "The output nodes for this workflow execution. Each node can be one of: FileOutputNode, ExternalDatabaseOutputNode, EmailOutputNode, or NoneOutputNode. Use the outputStorageType field to discriminate between types.",
            "items": {
              "type": "object"
            }
          },
          "executionNodes": {
            "description": "All workflow execution node instances for this run (every step), each with aggregate status and optional per-trigger runs. Not the same as outputNodes (leaf download nodes only).",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkflowExecutionNodeDetailDto"
            }
          },
          "intermediateStorageRetentionDays": {
            "type": "number",
            "description": "Configured retention window (days) before intermediate step files are removed from disk for non–Local Download outputs.",
            "example": 7
          },
          "inputFileNames": {
            "description": "Original user-uploaded input file names for this execution (under user-uploaded storage).",
            "example": [
              "sbom.json"
            ],
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "inputFiles": {
            "type": "array",
            "description": "Structured metadata for each uploaded input (starting node label and downstream targets).",
            "items": {
              "type": "object",
              "properties": {
                "fileName": {
                  "type": "string"
                },
                "startingWorkflowNodeId": {
                  "type": "string"
                },
                "startingNodeLabel": {
                  "type": "string"
                },
                "nextNodeNames": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "triggeredByEmail": {
            "type": "string",
            "description": "Email of the user who started this workflow execution.",
            "example": "user@example.com"
          }
        },
        "required": [
          "executionId",
          "outputNodesCount",
          "outputNodes",
          "executionNodes",
          "intermediateStorageRetentionDays"
        ]
      },
      "GetOrgTagResDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "color": {
            "type": "string",
            "nullable": true,
            "description": "Optional UI color; reserved for future use"
          },
          "orgId": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "color",
          "orgId"
        ]
      },
      "GetOrgTagsResDto": {
        "type": "object",
        "properties": {
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetOrgTagResDto"
            }
          }
        },
        "required": [
          "tags"
        ]
      },
      "CreateOrgTagDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128
          },
          "color": {
            "oneOf": [
              {
                "type": "string",
                "maxLength": 32
              },
              {}
            ]
          }
        },
        "required": [
          "name"
        ]
      },
      "GetWorkflowTemplateResDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique identifier"
          },
          "templateKey": {
            "type": "object",
            "description": "Stable template key (system templates only)",
            "nullable": true
          },
          "kind": {
            "type": "string",
            "description": "Template scope: system or org"
          },
          "name": {
            "type": "string",
            "description": "Template name"
          },
          "description": {
            "type": "string",
            "description": "Template description"
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetOrgTagResDto"
            }
          },
          "orgId": {
            "type": "object",
            "description": "Organization ID (org templates only)",
            "nullable": true
          },
          "definition": {
            "type": "object",
            "description": "Template definition with node references and edges"
          },
          "createdByProfileId": {
            "type": "object",
            "description": "Profile ID of the creator (org templates only)",
            "nullable": true
          },
          "createdAt": {
            "format": "date-time",
            "type": "string",
            "description": "Creation timestamp"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string",
            "description": "Last update timestamp"
          }
        },
        "required": [
          "id",
          "templateKey",
          "kind",
          "name",
          "description",
          "tags",
          "orgId",
          "definition",
          "createdByProfileId",
          "createdAt",
          "updatedAt"
        ]
      },
      "GetWorkflowTemplatesResDto": {
        "type": "object",
        "properties": {
          "templates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetWorkflowTemplateResDto"
            }
          }
        },
        "required": [
          "templates"
        ]
      },
      "CreateWorkflowTemplateDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "description": {
            "type": "string",
            "maxLength": 1000
          },
          "tagIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "definition": {
            "type": "object",
            "properties": {
              "nodeReferences": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "instanceId": {
                      "type": "string",
                      "minLength": 1
                    },
                    "backendNodeId": {
                      "type": "string",
                      "minLength": 1
                    },
                    "position": {
                      "type": "object",
                      "properties": {
                        "x": {
                          "type": "number"
                        },
                        "y": {
                          "type": "number"
                        }
                      },
                      "required": [
                        "x",
                        "y"
                      ]
                    },
                    "config": {
                      "type": "object",
                      "additionalProperties": {
                        "oneOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "number"
                          },
                          {
                            "type": "boolean"
                          },
                          {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        ]
                      }
                    }
                  },
                  "required": [
                    "instanceId",
                    "backendNodeId",
                    "position"
                  ]
                }
              },
              "edges": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "minLength": 1
                    },
                    "source": {
                      "type": "string",
                      "minLength": 1
                    },
                    "target": {
                      "type": "string",
                      "minLength": 1
                    },
                    "edgeType": {
                      "type": "string",
                      "enum": [
                        "success",
                        "error"
                      ]
                    }
                  },
                  "required": [
                    "id",
                    "source",
                    "target"
                  ]
                }
              }
            },
            "required": [
              "nodeReferences",
              "edges"
            ]
          }
        },
        "required": [
          "name",
          "description",
          "tagIds",
          "definition"
        ]
      },
      "UpdateWorkflowTemplateDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "description": {
            "type": "string",
            "maxLength": 1000
          },
          "tagIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "definition": {
            "type": "object",
            "properties": {
              "nodeReferences": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "instanceId": {
                      "type": "string",
                      "minLength": 1
                    },
                    "backendNodeId": {
                      "type": "string",
                      "minLength": 1
                    },
                    "position": {
                      "type": "object",
                      "properties": {
                        "x": {
                          "type": "number"
                        },
                        "y": {
                          "type": "number"
                        }
                      },
                      "required": [
                        "x",
                        "y"
                      ]
                    },
                    "config": {
                      "type": "object",
                      "additionalProperties": {
                        "oneOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "number"
                          },
                          {
                            "type": "boolean"
                          },
                          {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        ]
                      }
                    }
                  },
                  "required": [
                    "instanceId",
                    "backendNodeId",
                    "position"
                  ]
                }
              },
              "edges": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "minLength": 1
                    },
                    "source": {
                      "type": "string",
                      "minLength": 1
                    },
                    "target": {
                      "type": "string",
                      "minLength": 1
                    },
                    "edgeType": {
                      "type": "string",
                      "enum": [
                        "success",
                        "error"
                      ]
                    }
                  },
                  "required": [
                    "id",
                    "source",
                    "target"
                  ]
                }
              }
            },
            "required": [
              "nodeReferences",
              "edges"
            ]
          }
        }
      },
      "GetNodeResDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique identifier of the default node",
            "example": "transformation-jsonata"
          },
          "name": {
            "type": "string",
            "description": "Name of the node",
            "example": "JSONata Transform"
          },
          "description": {
            "type": "object",
            "description": "Description of the node functionality",
            "example": "JSONata for a lightweight transformation of JSON data.",
            "nullable": true
          },
          "category": {
            "type": "string",
            "description": "Category of the node",
            "example": "transformation",
            "enum": [
              "import-export",
              "database",
              "data-format",
              "fossid-workbench",
              "validation",
              "verification",
              "transformation",
              "normalization",
              "consolidation",
              "policy",
              "analysis",
              "reporting",
              "review"
            ]
          },
          "inputType": {
            "type": "array",
            "description": "Input data formats accepted by the node",
            "example": [
              "json"
            ],
            "items": {
              "type": "string",
              "enum": [
                "sbom",
                "any",
                "file",
                "json",
                "error"
              ]
            }
          },
          "outputType": {
            "type": "array",
            "description": "Output data formats produced by the node",
            "example": [
              "sbom"
            ],
            "items": {
              "type": "string",
              "enum": [
                "sbom",
                "any",
                "file",
                "json",
                "error"
              ]
            }
          },
          "inputTypeRestriction": {
            "type": "array",
            "description": "Blacklist of input types that should be blocked even if normally compatible (optional). For example, a node with inputType: [\"any\"] normally accepts any output, but inputTypeRestriction: [\"sbom\"] would block direct SBOM connections.",
            "example": [
              "sbom"
            ],
            "nullable": true,
            "items": {
              "type": "string",
              "enum": [
                "sbom",
                "any",
                "file",
                "json",
                "error"
              ]
            }
          },
          "paramsConfig": {
            "description": "Configuration parameters for the node",
            "example": [
              {
                "id": "jsonata_expression",
                "name": "JSONata Expression",
                "type": "string",
                "description": "JSONata expression for the transformation.",
                "required": true
              }
            ],
            "nullable": true,
            "type": "array",
            "items": {
              "type": "array"
            }
          },
          "configSchemaRaw": {
            "type": "object",
            "description": "Raw configuration schema from the external node manifest file",
            "nullable": true
          },
          "isReal": {
            "type": "boolean",
            "description": "Whether this node is a real (implemented) node",
            "example": false
          },
          "allowMultipleInputs": {
            "type": "boolean",
            "description": "Whether the node accepts connections from multiple upstream nodes",
            "example": true
          },
          "mergeAllInputs": {
            "type": "boolean",
            "description": "When true, the node waits for ALL upstream inputs and merges them into one combined output in a single run (e.g. Merge Data). Drives the merge marker/labels in the editor.",
            "example": true
          },
          "createdAt": {
            "format": "date-time",
            "type": "string",
            "description": "Creation timestamp",
            "example": "2023-01-01T00:00:00.000Z"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string",
            "description": "Last update timestamp",
            "example": "2023-01-01T00:00:00.000Z"
          }
        },
        "required": [
          "id",
          "name",
          "description",
          "category",
          "inputType",
          "outputType",
          "paramsConfig",
          "configSchemaRaw",
          "isReal",
          "createdAt",
          "updatedAt"
        ]
      },
      "GetNodesResDto": {
        "type": "object",
        "properties": {
          "nodesNumber": {
            "type": "number",
            "description": "Number of nodes",
            "example": 21
          },
          "nodes": {
            "description": "List of available nodes",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetNodeResDto"
            }
          }
        },
        "required": [
          "nodesNumber",
          "nodes"
        ]
      },
      "GetDashboardStatisticsResDto": {
        "type": "object",
        "properties": {
          "totalWorkflows": {
            "type": "number",
            "description": "Total number of workflows",
            "example": 42
          },
          "executionCounts": {
            "type": "object",
            "description": "Execution counts with total and grouped by UTC date (YYYY-MM-DD)",
            "example": {
              "total": 156,
              "byDate": {
                "2026-01-12": 23,
                "2026-01-13": 10
              }
            }
          },
          "activityLevel": {
            "type": "object",
            "description": "Activity level metrics",
            "example": {
              "total": 156,
              "executionsLast7Days": 15,
              "executionsLast30Days": 48
            }
          },
          "workflowStatesDistribution": {
            "type": "object",
            "description": "Workflow states distribution",
            "example": {
              "draft": 10,
              "published": 25,
              "stopped": 7
            }
          }
        },
        "required": [
          "totalWorkflows",
          "executionCounts",
          "activityLevel",
          "workflowStatesDistribution"
        ]
      },
      "RecentExecutionItemDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Execution ID"
          },
          "workflowId": {
            "type": "string",
            "description": "Workflow ID"
          },
          "workflowName": {
            "type": "string",
            "description": "Workflow name"
          },
          "workflowVersion": {
            "type": "number",
            "description": "Version of the workflow that was executed"
          },
          "status": {
            "type": "string",
            "description": "Execution status",
            "enum": [
              "pending",
              "in_progress",
              "pending_approval",
              "completed",
              "partially_completed",
              "error_handled",
              "failed",
              "rejected"
            ]
          },
          "startedAt": {
            "format": "date-time",
            "type": "string",
            "description": "When the execution started"
          },
          "completedAt": {
            "type": "object",
            "description": "When the execution completed (null if still running or not yet set)",
            "nullable": true
          },
          "durationMs": {
            "type": "object",
            "description": "Duration in milliseconds (null if not completed/failed)",
            "nullable": true
          },
          "triggeredByEmail": {
            "type": "string",
            "description": "Email of the user who triggered the execution"
          },
          "triggeredById": {
            "type": "object",
            "description": "ID of the profile who triggered the execution",
            "nullable": true
          }
        },
        "required": [
          "id",
          "workflowId",
          "workflowName",
          "status",
          "startedAt",
          "completedAt",
          "durationMs",
          "triggeredByEmail",
          "triggeredById"
        ]
      },
      "GetRecentExecutionsResDto": {
        "type": "object",
        "properties": {
          "total": {
            "type": "number",
            "description": "Total number of items"
          },
          "page": {
            "type": "number",
            "description": "Current page (1-based)"
          },
          "limit": {
            "type": "number",
            "description": "Items per page"
          },
          "totalPages": {
            "type": "number",
            "description": "Total number of pages"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RecentExecutionItemDto"
            }
          }
        },
        "required": [
          "total",
          "page",
          "limit",
          "totalPages",
          "items"
        ]
      }
    }
  },
  "x-tagGroups": [
    {
      "name": "Workflows",
      "tags": [
        "Workflows",
        "Executions",
        "Templates",
        "Nodes",
        "Tags",
        "Reviews"
      ]
    },
    {
      "name": "Connections",
      "tags": [
        "All connections",
        "Databases",
        "FossID",
        "Storages"
      ]
    },
    {
      "name": "Organization",
      "tags": [
        "Organizations and users",
        "User settings"
      ]
    },
    {
      "name": "Platform",
      "tags": [
        "Statistics",
        "Health check",
        "Service root"
      ]
    }
  ]
}
