From c0d24a667b9f832576096e01d576d013b43069ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Fri, 7 Feb 2025 15:54:03 +0000 Subject: [PATCH 01/25] Update openapi-ts to new parser #191 --- openapi-clowm.json | 2 +- openapi-ts.config.ts | 1 - package-lock.json | 770 +--- package.json | 10 +- src/App.vue | 3 +- src/client/client.gen.ts | 28 + src/client/index.ts | 2 +- src/client/sdk.gen.ts | 2944 +++++++------- src/client/transformers.gen.ts | 21 + src/client/types.gen.ts | 3448 +++++++++++++---- src/components/AppHeader.vue | 23 +- .../ParameterSchemaFormComponent.vue | 6 +- .../workflows/WorkflowDocumentationTabs.vue | 4 +- src/router/userRoutes.ts | 12 + src/stores/buckets.ts | 12 - src/stores/news.ts | 4 +- src/stores/otrs.ts | 7 - src/stores/resources.ts | 15 +- src/stores/s3keys.ts | 3 - src/stores/users.ts | 11 +- src/stores/workflowExecutions.ts | 8 +- src/stores/workflows.ts | 31 +- src/views/LoginView.vue | 62 +- src/views/user/ProfileView.vue | 7 + .../CreateParameterTranslationView.vue | 4 +- src/views/workflows/MyWorkflowsView.vue | 4 +- src/views/workflows/StartWorkflowView.vue | 2 +- .../UpdateWorkflowVersionMetadata.vue | 2 +- vite.config.ts | 8 + 29 files changed, 4516 insertions(+), 2938 deletions(-) create mode 100644 src/client/client.gen.ts create mode 100644 src/client/transformers.gen.ts create mode 100644 src/views/user/ProfileView.vue diff --git a/openapi-clowm.json b/openapi-clowm.json index 5ea3840..1dfafd3 100644 --- a/openapi-clowm.json +++ b/openapi-clowm.json @@ -1 +1 @@ -{"openapi":"3.1.0","info":{"title":"CloWM UI API","description":"This is the API for the CloWM UI. It is only for internal use and will change without prior notice.","version":"1.0"},"servers":[{"url":"/api"}],"paths":{"/ui/tokens":{"get":{"tags":["APIToken"],"summary":"List API token","description":"List meta information about all API token.\n\nPermissions `api_token:list_all` required. See parameter `uid` for exception.","operationId":"APIToken-list_token","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiTokenOut"},"title":"Response Apitoken-List Token"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["APIToken"],"summary":"Create new API token","description":"Create a new API token for the current user.\n\nPermission `api_token:create` required.","operationId":"APIToken-create_token","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenIn","description":"Meta-data for Api token to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenPrivateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/tokens/{tid}":{"get":{"tags":["APIToken"],"summary":"Get API token","description":"Get an API token by id.\n\nPermission `api_token:read` required if the current user is the owner of the API token,\notherwise `api_token:read_any` required.","operationId":"APIToken-get_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["APIToken"],"summary":"Delete API token","description":"Delete an API token by id.\n\nPermission `api_token:delete` required if the current user is the owner of the API token,\notherwise `api_token:delete_any` required.","operationId":"APIToken-delete_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users":{"post":{"tags":["User"],"summary":"Create User","description":"Create a new user in the system and notify him.\n\nPermission `user:create` required.","operationId":"User-create_user","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserIn","description":"Meta-data for user to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["User"],"summary":"List users and search by their name","description":"List all users in the system..\n\nPermission `user:list` required.","operationId":"User-list_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter users by a substring in their name.","examples":["Bilbo"],"title":"Name Substring"},"description":"Filter users by a substring in their name."},{"name":"filter_roles","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/RoleEnum"}},{"type":"null"}],"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression.","title":"Filter Roles"},"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOutExtended"},"title":"Response User-List Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/search":{"get":{"tags":["User"],"summary":"Search Users","description":"Search for users in the system by their name.\n\nPermission `user: search` required.","operationId":"User-search_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":30,"description":"Filter users by a substring in their name.","title":"Name Substring"},"description":"Filter users by a substring in their name."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOut"},"title":"Response User-Search Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/me":{"get":{"tags":["User"],"summary":"Get the logged in user","description":"Return the user associated with the used JWT.\n\nPermission `user:read` required.","operationId":"User-get_logged_in_user","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}}},"security":[{"Session Token":[]}]}},"/ui/users/{uid}":{"get":{"tags":["User"],"summary":"Get a user by its uid","description":"Return the user with the specific uid.\n\nPermission `user:read` required.","operationId":"User-get_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/roles":{"put":{"tags":["User"],"summary":"Update user roles","description":"Update the roles of a user.\n\nPermission `user:update` required.","operationId":"User-update_roles","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRoles","description":"The new roles of the user"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/invitation":{"patch":{"tags":["User"],"summary":"Resend Invitation","description":"Resend the invitation link for an user that has an open invitation.\n\nPermission `user:create` required.","operationId":"User-resend_invitation","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys":{"get":{"tags":["S3Key"],"summary":"Get the S3 Access keys from a user","description":"Get all the S3 Access keys for a specific user.\n\nPermission `s3_key:list` required if the current user is the target, otherwise `s3_key:list_all` required.","operationId":"S3Key-get_user_keys","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/S3Key"},"title":"Response S3Key-Get User Keys"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["S3Key"],"summary":"Create a Access key for a user","description":"Create a S3 Access key for a specific user.\n\nPermission `s3_key:create` required if the current user is the target, otherwise `s3_key:create_any` required.","operationId":"S3Key-create_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys/{access_id}":{"get":{"tags":["S3Key"],"summary":"Get a specific S3 Access key from a user","description":"Get a specific S3 Access Key for a specific user.\n\nPermission `s3_key:read` required if the current user is the target, otherwise `s3_key:read_any` required.","operationId":"S3Key-get_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["S3Key"],"summary":"Delete a specific S3 Access key from a user","description":"Delete a specific S3 Access key for a specific user.\n\nPermission `s3_key:delete` required if the current user is the target, otherwise `s3_key:delete_any` required.","operationId":"S3Key-delete_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets":{"get":{"tags":["Bucket"],"summary":"List buckets","description":"List all the buckets in the system or of the desired user where the user has permissions for.\n\nPermission `bucket:list_all` required. See parameter `owner_id` for exception.","operationId":"Bucket-list_buckets","security":[{"Session Token":[]}],"parameters":[{"name":"owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Owner Id"},"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target."},{"name":"bucket_type","in":"query","required":false,"schema":{"$ref":"#/components/schemas/BucketType","description":"Type of the bucket to get. Ignored when `user` parameter not set","default":"ALL"},"description":"Type of the bucket to get. Ignored when `user` parameter not set"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketOut"},"title":"Response Bucket-List Buckets"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket for the current user","description":"Create a bucket for the current user.\n\nThe name of the bucket has some constraints.\nFor more information see the\n[Ceph documentation](https://docs.ceph.com/en/quincy/radosgw/s3/bucketops/#constraints)\n\nPermission `bucket:create` required.","operationId":"Bucket-create_bucket","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketIn","description":"Meta-data for bucket to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"List bucket OTRs","description":"Get the ownership transfer requests for buckets.\n\nPermission `bucket:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `bucket:list_all`","operationId":"Bucket-list_bucket_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Bucket-List Bucket Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}":{"get":{"tags":["Bucket"],"summary":"Get a bucket by its name","description":"Get a bucket by its name if the current user has READ permissions for the bucket.\n\nPermission `bucket:read` required if the current user is the owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket","description":"Delete a bucket by its name. Only the owner of the bucket can delete the bucket.\n\nPermission `bucket:delete` required if the current user is the owner of the bucket,\notherwise `bucket:delete_any` required.","operationId":"Bucket-delete_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"force_delete","in":"query","required":false,"schema":{"type":"boolean","description":"Delete even non-empty bucket","default":false,"title":"Force Delete"},"description":"Delete even non-empty bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"Get a bucket OTR","description":"Get a specific bucket ownership transfer request.\n\nPermission `bucket:read` required if the current user is the current or new owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket OTR","description":"Create a ownership transfer request for a specific bucket.\n\nPermission `bucket:update` required if the current user is the current owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-create_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the bucket OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Bucket"],"summary":"Accept a bucket OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `bucket:update` required if the current user is the new owner of the workflow,\notherwise `bucket:update_any` required.","operationId":"Bucket-accept_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket OTR","description":"Delete/Reject a bucket ownership transfer request.\n\nPermission `bucket:update` required if the current user is the current or new owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-delete_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/public":{"patch":{"tags":["Bucket"],"summary":"Update public status","description":"Update the buckets public state.\n\nPermission `bucket:update` required if the current user is the owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-update_bucket_public_state","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_Bucket-update_bucket_public_state"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/limits":{"patch":{"tags":["Bucket"],"summary":"Update bucket limits","description":"Update the buckets size limits.\n\nPermission `bucket:update_any` required.","operationId":"Bucket-update_bucket_limits","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketSizeLimits","description":"New size limits for bucket"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions.","description":"List all the bucket permissions in the system.\n\nPermission `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions","security":[{"Session Token":[]}],"parameters":[{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["BucketPermission"],"summary":"Create a permission.","description":"Create a permission for a bucket and user.\n\nPermission `bucket_permission:create` required.","operationId":"BucketPermission-create_permission","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionIn","description":"Permission to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a user.","description":"List all the bucket permissions for the given user.\n\nPermission `bucket_permission:list` required if current user is the target the bucket permission,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per User"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a bucket.","description":"List all the bucket permissions for the given bucket.\n\nPermission `bucket_permission:list` required if current user is owner of the bucket,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per Bucket"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get permission for bucket and user combination.","description":"Get the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:read` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:read_any` required.","operationId":"BucketPermission-get_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["BucketPermission"],"summary":"Update a bucket permission","description":"Update a permission for a bucket and user.\n\nPermission `bucket_permission:update` required.","operationId":"BucketPermission-update_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionParameters","description":"Permission to create"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["BucketPermission"],"summary":"Delete a bucket permission","description":"Delete the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:delete` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:delete_any` required.","operationId":"BucketPermission-delete_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows":{"post":{"tags":["Workflow"],"summary":"Create a new workflow","description":"Create a new workflow.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow-create_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowIn","description":"Meta-date for the workflow to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow"],"summary":"List workflows","description":"List all workflows.\n\nPermission `workflow:list` required.","operationId":"Workflow-list_workflows","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter workflows by a substring in their name.","examples":["blast"],"title":"Name Substring"},"description":"Filter workflows by a substring in their name."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`.","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`."},{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowOut"},"title":"Response Workflow-List Workflows"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"List workflow OTRs","description":"Get the ownership transfer requests for workflows.\n\nPermission `workflow:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `workflow:list_all`","operationId":"Workflow-list_workflow_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Workflow-List Workflow Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/developer_statistics":{"get":{"tags":["Workflow"],"summary":"Get anonymized workflow execution","description":"Get the workflow executions with meta information and anonymized user IDs.\n\nPermission `workflow:read` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:read_any`.","operationId":"Workflow-get_developer_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter by the developer of the workflows","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter by the developer of the workflows"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"description":"Filter by workflow IDs","title":"Workflow Id"},"description":"Filter by workflow IDs"},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions after this date","title":"Start"},"description":"Filter by workflow executions after this date"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions before this date","title":"End"},"description":"Filter by workflow executions before this date"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnonymizedWorkflowExecution"},"title":"Response Workflow-Get Developer Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}":{"get":{"tags":["Workflow"],"summary":"Get a workflow","description":"Get a specific workflow.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow","description":"Delete a workflow.\n\nPermission `workflow:delete` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:delete_any`.","operationId":"Workflow-delete_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"Get a workflow OTR","description":"Get a specific workflow ownership transfer request.\n\nPermission `workflow:read` required if current user is the current or new owner of the workflow,\notherwise `workflow:read_any` required.","operationId":"Workflow-get_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Workflow"],"summary":"Create a workflow OTR","description":"Create a ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the current owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-create_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for workflow OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Workflow"],"summary":"Accept a workflow OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-accept_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow OTR","description":"Delete/Reject a workflow ownership transfer request.\n\nPermission `workflow:update` required if current user is the current or new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-delete_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/statistics":{"get":{"tags":["Workflow"],"summary":"Get statistics for a workflow","description":"Get the number of started workflow per day.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowStatistic"},"title":"Response Workflow-Get Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/update":{"post":{"tags":["Workflow"],"summary":"Update a workflow","description":"Create a new workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow-update_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdate","description":"Meta-data for the workflow version to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions":{"get":{"tags":["Workflow Version"],"summary":"Get all versions of a workflow","description":"List all versions of a Workflow.\n\nPermission `workflow:list` required.","operationId":"Workflow Version-list_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"title":"Response Workflow Version-List Workflow Version"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}":{"get":{"tags":["Workflow Version"],"summary":"Get a workflow version","description":"Get a specific version of a workflow.\n\nPermission `workflow:read` required if the version is public or you are the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit `git_commit_hash` of specific version or `latest`.","examples":["latest","ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit `git_commit_hash` of specific version or `latest`."},{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/status":{"patch":{"tags":["Workflow Version"],"summary":"Update status of workflow version","description":"Update the status of a workflow version.\n\nPermission `workflow:update_status`","operationId":"Workflow Version-update_workflow_version_status","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionStatusSchema","description":"New Status of the workflow version"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/metadata":{"get":{"tags":["Workflow Version"],"summary":"Get metadata of workflow version","description":"Get the metadata of a workflow version.\n\nPermission `workflow:read` required if the current user is the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Version"],"summary":"Update metadata of workflow version","description":"Update the metadata of a workflow version.\n\nPermission `workflow:update` required if the current user is the developer of the workflow,\notherwise `workflow:update_any`","operationId":"Workflow Version-update_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/deprecate":{"patch":{"tags":["Workflow Version"],"summary":"Deprecate a workflow version","description":"Deprecate a workflow version.\n\nPermission `workflow:update` required if you are the developer of the workflow,\notherwise `workflow:update_status`","operationId":"Workflow Version-deprecate_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/parameter-extension":{"patch":{"tags":["Workflow Version"],"summary":"Update parameter extension of workflow version","description":"Update the parameter extension of a workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-update_workflow_version_parameter_extension","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParameterExtension-Input","description":"Parameter extension specific for this CloWM instance"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/documentation":{"get":{"tags":["Workflow Version"],"summary":"Fetch documentation for a workflow version","description":"Get the documentation for a specific workflow version.\nStreams the response directly from the right git repository.\n\nPermission `workflow:read` required.","operationId":"Workflow Version-download_workflow_documentation","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."},{"name":"document","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DocumentationEnum","description":"Specify which type of documentation the client wants to fetch","default":"usage.md"},"description":"Specify which type of documentation the client wants to fetch"},{"name":"mode_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Workflow Mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"Workflow Mode"}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/icon":{"post":{"tags":["Workflow Version"],"summary":"Upload icon for workflow version","description":"Upload an icon for the workflow version and returns the new icon URL.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-upload_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_Workflow_Version-upload_workflow_version_icon"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IconUpdateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Version"],"summary":"Delete icon of workflow version","description":"Delete the icon of the workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-delete_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions":{"post":{"tags":["Workflow Execution"],"summary":"Start a new workflow execution","description":"Start a new workflow execution. Workflow versions wit status `DEPRECATED` or `DENIED` can't be started.\n\nPermission `workflow_execution:create` required if workflow versions status is `PUBLISHED`,\notherwise `workflow_execution:create_any` required.","operationId":"Workflow Execution-start_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow Execution"],"summary":"List all workflow executions","description":"Get all workflow executions.\n\nThis endpoint enforces keyset pagination. To iterate over all workflow executions, follow the link provided in the\n`Link` header.\nA missing `Link` header indicates that you iterated over all workflow executions with the current filters.\n\nPermission `workflow_execution:list` required, if `executor_id` is the same as the current user,\notherwise `workflow_execution:list_all` required.","operationId":"Workflow Execution-list_workflow_executions","security":[{"Session Token":[]}],"parameters":[{"name":"executor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Executor Id"},"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required."},{"name":"execution_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionStatus"}},{"type":"null"}],"description":"Filter for status of workflow execution","title":"Execution Status"},"description":"Filter for status of workflow execution"},{"name":"workflow_version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":40,"maxLength":40,"pattern":"^[0-9a-f]+$"},{"type":"null"}],"description":"Filter for workflow version","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Workflow Version Id"},"description":"Filter for workflow version"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Workflow Id"},"description":"Filter for workflow"},{"name":"start_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started after this UNIX timestamp","examples":[1640991600],"title":"Start After"},"description":"Filter for workflow executions that started after this UNIX timestamp"},{"name":"start_before","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started before this UNIX timestamp","examples":[1640991600],"title":"Start Before"},"description":"Filter for workflow executions that started before this UNIX timestamp"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionOut"},"title":"Response Workflow Execution-List Workflow Executions"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<http://localhost:9999/api/workflow_executions?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/arbitrary":{"post":{"tags":["Workflow Execution"],"summary":"Start a workflow execution with arbitrary git repository","description":"Start a new workflow execution from an arbitrary git repository.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow Execution-start_arbitrary_workflow","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevWorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Session Token":[]}]}},"/ui/workflow_executions/{eid}":{"get":{"tags":["Workflow Execution"],"summary":"Get a workflow execution","description":"Get a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Execution"],"summary":"Delete a workflow execution","description":"Delete a specific workflow execution.\n\nPermission `workflow_execution:delete` required if the current user started the workflow execution,\notherwise `workflow_execution:delete_any` required.","operationId":"Workflow Execution-delete_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/params":{"get":{"tags":["Workflow Execution"],"summary":"Get the parameters of a workflow execution","description":"Get the parameters of a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution_params","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Workflow Execution-Get Workflow Execution Params"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/cancel":{"post":{"tags":["Workflow Execution"],"summary":"Cancel a workflow execution","description":"Cancel a running workflow execution.\n\nPermission `workflow_execution:cancel` required if the current user started the workflow execution,\notherwise `workflow_execution:cancel_any` required.","operationId":"Workflow Execution-cancel_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/credentials":{"get":{"tags":["Workflow Credentials"],"summary":"Get the credentials of a workflow","description":"Get the credentials for the repository of a workflow. Only the developer of a workflow can do this.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-get_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Credentials"],"summary":"Update the credentials of a workflow","description":"Update the credentials for the repository of a workflow.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-update_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsIn","description":"Updated credentials for the workflow git repository"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Credentials"],"summary":"Delete the credentials of a workflow","description":"Delete the credentials for the repository of a workflow.\n\nPermission `workflow:delete` required if the developer of the workflow is the same as the current user,\nother `workflow:delete_any`.","operationId":"Workflow Credentials-delete_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_modes/{mode_id}":{"get":{"tags":["Workflow Mode"],"summary":"Get workflow mode","description":"Get a workflow mode.\n\nPermission `workflow:read` required","operationId":"Workflow Mode-get_workflow_mode","security":[{"Session Token":[]}],"parameters":[{"name":"mode_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"ID of a workflow mode"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowModeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources":{"post":{"tags":["Resource"],"summary":"Request a new resource","description":"Request a new resources.\n\nPermission `resource:create` required.","operationId":"Resource-create_resource","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceIn","description":"Meta-data for the resource to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Resource"],"summary":"List resources","description":"List all resources.\n\nPermission `resource:list` required.","operationId":"Resource-list_resources","security":[{"Session Token":[]}],"parameters":[{"name":"maintainer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Maintainer Id"},"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required."},{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"description":"Filter resources by a substring in their name.","examples":["gtdb"],"title":"Name Substring"},"description":"Filter resources by a substring in their name."},{"name":"public","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter resources to by the public flag","title":"Public"},"description":"Filter resources to by the public flag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceOut"},"title":"Response Resource-List Resources"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/sync_requests":{"get":{"tags":["Resource"],"summary":"List resource sync requests","description":"List all resource sync requests.\n\nPermission `resource:update_any` required.","operationId":"Resource-list_sync_requests","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UserSynchronizationRequestOut"},"type":"array","title":"Response Resource-List Sync Requests"}}}}},"security":[{"Session Token":[]}]}},"/ui/resources/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"List resource OTRs","description":"Get the ownership transfer requests for resources.\n\nPermission `resource:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `resource:list_all`","operationId":"Resource-list_resource_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Resource-List Resource Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}":{"get":{"tags":["Resource"],"summary":"Get a resource","description":"Get a specific resource.\n\nPermission `resource:read` required.","operationId":"Resource-get_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource","description":"Delete a resources.\n\nPermission `resource:delete` required.","operationId":"Resource-delete_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"Get a resource OTR","description":"Get a specific resource ownership transfer request.\n\nPermission `resource:read` required if the current user is the current or new owner of the resource,\notherwise `resource:read_any` required.","operationId":"Resource-get_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Resource"],"summary":"Create a resource OTR","description":"Create a ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the current owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-create_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the resource OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Resource"],"summary":"Accept a resource OTR","description":"Accept an ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-accept_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource OTR","description":"Delete/Reject a resource ownership transfer request.\n\nPermission `resource:update` required if the current user is the current or new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-delete_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions":{"get":{"tags":["ResourceVersion"],"summary":"List versions of a resource","description":"List all the resource version for a specific resource.\n\nPermission 'resource:read' required.","operationId":"ResourceVersion-list_resource_versions","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionOut"},"title":"Response Resourceversion-List Resource Versions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["ResourceVersion"],"summary":"Request new version of a resource","description":"Request a new resource version.\n\nPermission `resource:update` required if the current user is the maintainer, `resource:update_any` otherwise.","operationId":"ResourceVersion-request_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionIn","description":"Meta-data for the resource version to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}":{"get":{"tags":["ResourceVersion"],"summary":"Get version of a resource","description":"Get a specific resource version for a specific resource.\n\nPermission `resource:read` required. If the status of the resource version is not `LATEST` or `SYNCHRONIZED` and\nthe current user is not the maintainer, then the permission `resource:read_any` is required.","operationId":"ResourceVersion-get_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/tree":{"get":{"tags":["ResourceVersion"],"summary":"Download folder structure of resource","description":"Get the folder structure of the resources. Only available if the resource was previously downloaded to the cluster.\n\nPermission `resource:read` required.","operationId":"ResourceVersion-resource_file_tree","security":[{"Session Token":[]}],"parameters":[{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"},{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FileTree"},"title":"Response Resourceversion-Resource File Tree"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_review":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version review","description":"Request the review of a resource version.\n\nPermission `resource:update` required.","operationId":"ResourceVersion-request_resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_sync":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version synchronization","description":"Request the synchronization of a resource version to the cluster.\n\nPermission `resource:request_sync` required.","operationId":"ResourceVersion-request_resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSynchronizationRequestIn","description":"Meta-data for the synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/review":{"put":{"tags":["ResourceVersion"],"summary":"Review resource version","description":"Review answer the resource version.\n\nPermission `resource:update_status` required.","operationId":"ResourceVersion-resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer for the resource version review"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/sync":{"put":{"tags":["ResourceVersion"],"summary":"Synchronize resource version with cluster","description":"Synchronize the resource version to the cluster.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer to the resource version synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/latest":{"put":{"tags":["ResourceVersion"],"summary":"Set resource version to latest","description":"Set the resource version as the latest version.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_latest","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/cluster":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version on cluster","description":"Delete the resource version on the cluster.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_cluster","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/s3":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version in S3","description":"Delete the resource version in the S3 bucket.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_s3","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news":{"post":{"tags":["News"],"summary":"Create news","description":"Create a news event.\n\nPermission `news:create` required.","operationId":"News-create_news","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsIn","description":"Meta-data for news event to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["News"],"summary":"List news","description":"List all news events with filters.\n\nThis endpoint enforces keyset pagination. To iterate over all news, follow the link provided in the `Link` header.\nA missing `Link` header indicates that you iterated over all news with the current filters.\n\nPermission `news:list` required.","operationId":"News-list_news","security":[{"Session Token":[]}],"parameters":[{"name":"created_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967296,"minimum":0},{"type":"null"}],"description":"Filter for news that are created after this UNIX timestamp","title":"Created After"},"description":"Filter for news that are created after this UNIX timestamp"},{"name":"creator_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for news created by a specific user","title":"Creator Id"},"description":"Filter for news created by a specific user"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NewsOut"},"title":"Response News-List News"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<http://localhost:9999/api/news?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news/latest":{"get":{"tags":["News"],"summary":"Get latest news","description":"List the current news events.\n\nPermission `news:list` required.","operationId":"News-list_latest_news","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NewsOut"},"type":"array","title":"Response News-List Latest News"}}}}},"security":[{"Session Token":[]}]}},"/ui/news/{nid}":{"get":{"tags":["News"],"summary":"Get a specific news","description":"Get a specified news event.\n\nPermission `news:read` required.","operationId":"News-get_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["News"],"summary":"Delete a specific news","description":"Delete a specified news event.\n\nPermission `news:delete` required.","operationId":"News-delete_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/public/workflows":{"get":{"tags":["Public"],"summary":"Get available workflows","description":"Public route to fetch all available workflows.","operationId":"Public-get_public_workflows","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PublicWorkflowOut"},"type":"array","title":"Response Public-Get Public Workflows"}}}}}}}},"components":{"schemas":{"AnonymizedWorkflowExecution":{"properties":{"workflow_execution_id":{"type":"string","title":"Workflow Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"pseudo_uid":{"type":"string","title":"Pseudo Uid","description":"Anonymized user ID of the user who ran the workflow execution","examples":["7ed4249857b656e96f456449796e461e6001d3fb2481a44701f70ca437bd53a2"]},"workflow_mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Mode Id","description":"ID of the workflow mode this workflow execution ran in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"workflow_version_id":{"type":"string","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"started_at":{"type":"string","format":"date","title":"Started At","description":"Day of the workflow execution","examples":["2023-01-01"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"developer_id":{"type":"string","title":"Developer Id","description":"ID of developer of the workflow","examples":["28c5353b8bb34984a8bd4169ba94c606"]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"End status of the workflow execution","examples":["SUCCESS"]}},"type":"object","required":["workflow_execution_id","pseudo_uid","workflow_version_id","started_at","workflow_id","developer_id","status"],"title":"AnonymizedWorkflowExecution"},"ApiTokenIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"}},"type":"object","required":["name","scopes"],"title":"ApiTokenIn"},"ApiTokenOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]}},"type":"object","required":["name","scopes","token_id","uid","created_at"],"title":"ApiTokenOut"},"ApiTokenPrivateOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]},"token":{"type":"string","title":"Token","description":"The actual token used for authentication","examples":["J21NRKUYgyVUgvJ3cIdllS-MMa9ny1UDKFF18aetDvo"]}},"type":"object","required":["name","scopes","token_id","uid","created_at","token"],"title":"ApiTokenPrivateOut"},"Body_Bucket-update_bucket_public_state":{"properties":{"public":{"type":"boolean","title":"Public","description":"New public state"}},"type":"object","required":["public"],"title":"Body_Bucket-update_bucket_public_state"},"Body_Workflow_Version-upload_workflow_version_icon":{"properties":{"icon":{"type":"string","format":"binary","title":"Icon","description":"Icon for the Workflow."}},"type":"object","required":["icon"],"title":"Body_Workflow Version-upload_workflow_version_icon"},"BucketIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]}},"type":"object","required":["name","description"],"title":"BucketIn","description":"Schema for creating a new bucket."},"BucketOut":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]},"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]},"owner_id":{"type":"string","title":"Owner Id","description":"UID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"public":{"type":"boolean","title":"Public","description":"Flag if the bucket is anonymously readable"}},"type":"object","required":["name","description","created_at","owner_id","public"],"title":"BucketOut","description":"Schema for answering a request with a bucket."},"BucketPermissionIn":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","format":"uuid","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionIn"},"BucketPermissionOut":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionOut","description":"Schema for the bucket permissions."},"BucketPermissionParameters":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"}},"type":"object","required":["scopes"],"title":"BucketPermissionParameters","description":"Schema for the parameters of a bucket permission."},"BucketSizeLimits":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]}},"type":"object","title":"BucketSizeLimits","description":"Schema to represent bucket limits."},"BucketType":{"type":"string","enum":["OWN","ALL","PERMISSION"],"title":"BucketType","description":"Enumeration for the type of buckets to fetch from the DB\n\nOWN: Only fetch buckets that the user owns\nPERMISSION: Only fetch foreign buckets that the user has access to\nALL: Fetch all buckets that the user has access to"},"DevWorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"mode":{"anyOf":[{"$ref":"#/components/schemas/WorkflowModeIn"},{"type":"null"}],"description":"Mode of the workflow with an alternative entrypoint"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow execution requires"}},"type":"object","required":["parameters","git_commit_hash","repository_url","nextflow_version"],"title":"DevWorkflowExecutionIn"},"DocumentationEnum":{"type":"string","enum":["usage.md","input.md","output.md","changelog.md","parameter_schema.json","clowm_info.json","CITATIONS.md"],"title":"DocumentationEnum"},"FileTree":{"properties":{"type":{"type":"string","enum":["file","directory","link"],"title":"Type"},"name":{"type":"string","title":"Name"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"},"contents":{"anyOf":[{"items":{"$ref":"#/components/schemas/FileTree"},"type":"array"},{"type":"null"}],"title":"Contents"},"size":{"type":"integer","title":"Size"}},"type":"object","required":["type","name","size"],"title":"FileTree"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IconUpdateOut":{"properties":{"icon_url":{"type":"string","minLength":1,"format":"uri","title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["icon_url"],"title":"IconUpdateOut"},"InstanceSpecificDefaultParameters":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"}]},"type":"object"},"NewsIn":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event","default":"system"}},"type":"object","required":["content","title"],"title":"NewsIn"},"NewsOut":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event"},"news_id":{"type":"string","title":"News Id","description":"ID of the news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"]},"creator_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Id","description":"ID of the creator","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]}},"type":"object","required":["content","title","category","news_id","created_at"],"title":"NewsOut"},"NextflowVersion":{"type":"string","enum":["22.10.0","22.10.1","22.10.2","22.10.3","22.10.4","22.10.5","22.10.6","22.10.7","22.10.8","23.04.0","23.04.1","23.04.2","23.04.3","23.04.4","23.04.5","23.10.0","23.10.1","23.10.2","23.10.3","23.10.4","24.04.1","24.04.2","24.04.3","24.04.4","24.10.0"],"title":"NextflowVersion"},"OwnershipTransferRequestIn":{"properties":{"new_owner_uid":{"type":"string","format":"uuid","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Comment","description":"An optional comment for the transfer request","examples":["This is an example comment"]}},"type":"object","required":["new_owner_uid"],"title":"OwnershipTransferRequestIn"},"OwnershipTransferRequestOut":{"properties":{"new_owner_uid":{"type":"string","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"type":"string","title":"Comment","description":"An optional comment for the transfer request","default":"","examples":["This is an example comment"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Time when the ownership transfer was requested as UNIX timestamp","examples":[1640991600]},"current_owner_uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Owner Uid","description":"The current uid of the current owner if he exists","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"target_id":{"type":"string","title":"Target Id","description":"Id of the target that gets its ownership transferred"},"target_name":{"type":"string","title":"Target Name","description":"Name of the target","examples":["example-bucket","Example Workflow","Example Resource"]},"target_description":{"type":"string","title":"Target Description","description":"Description of then target","examples":["Some long description of a target"]},"target_type":{"$ref":"#/components/schemas/OwnershipTypeEnum","description":"Target type of the ownership transfer","examples":["bucket"]}},"type":"object","required":["new_owner_uid","created_at","target_id","target_name","target_description","target_type"],"title":"OwnershipTransferRequestOut"},"OwnershipTypeEnum":{"type":"string","enum":["bucket","workflow","resource"],"title":"OwnershipTypeEnum"},"ParameterExtension-Input":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterExtension-Output":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterVisibility":{"type":"integer","enum":[10,20,30,40],"title":"ParameterVisibility"},"ParameterVisibilityMapping":{"additionalProperties":{"$ref":"#/components/schemas/ParameterVisibility"},"type":"object"},"PermissionStatus":{"type":"string","enum":["ACTIVE","INACTIVE"],"title":"PermissionStatus","description":"Status of a bucket permission. Can be either `ACTIVE` or `INACTIVE`. A permission can only get `INACTIVE` if the\npermission itself has a time limit and the current time is not in the timespan."},"PublicWorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"latest_git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Latest Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"latest_version_tag":{"type":"string","maxLength":10,"minLength":5,"title":"Latest Version Tag","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"developer":{"type":"string","title":"Developer","description":"Name of the developer","default":"","examples":["Bilbo Baggins"]},"latest_version_timestamp":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Latest Version Timestamp","description":"Timestamp when the last version was created as UNIX timestamp","examples":[1640991600]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the workflow icon","readOnly":true,"examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["name","short_description","repository_url","workflow_id","latest_git_commit_hash","latest_version_tag","latest_version_timestamp","icon_url"],"title":"PublicWorkflowOut"},"ResourceIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true}},"type":"object","required":["release","name","description","source"],"title":"ResourceIn"},"ResourceOut":{"properties":{"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"maintainer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Maintainer Id","description":"ID of the maintainer","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"versions":{"items":{"$ref":"#/components/schemas/ResourceVersionOut"},"type":"array","title":"Versions","description":"Versions of the resource"}},"type":"object","required":["name","description","source","resource_id","maintainer_id","versions"],"title":"ResourceOut"},"ResourceVersionIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]}},"type":"object","required":["release"],"title":"ResourceVersionIn"},"ResourceVersionOut":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"status":{"$ref":"#/components/schemas/ResourceVersionStatus","description":"Status of the resource version"},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1672527600]},"compressed_size":{"type":"integer","maximum":1.8446744073709552e+19,"minimum":0.0,"title":"Compressed Size","description":"Size of the compressed resource in bytes","examples":[42097156608]},"cluster_path":{"type":"string","title":"Cluster Path","description":"Path to the resource on the cluster if the resource is synchronized","readOnly":true,"examples":["/vol/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4","/vol/resources/CLDB-0e240ccd/latest"]},"s3_path":{"type":"string","title":"S3 Path","description":"Path to the resource in the S3 Bucket. Not publicly available.","readOnly":true,"examples":["s3://clowm-data/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4/resource.tar.gz"]}},"type":"object","required":["release","status","resource_version_id","resource_id","created_at","compressed_size","cluster_path","s3_path"],"title":"ResourceVersionOut"},"ResourceVersionStatus":{"type":"string","enum":["RESOURCE_REQUESTED","WAIT_FOR_REVIEW","DENIED","APPROVED","SYNC_REQUESTED","SYNCHRONIZING","SYNC_ERROR","SYNCHRONIZED","SETTING_LATEST","LATEST","CLUSTER_DELETING","CLUSTER_DELETE_ERROR","S3_DELETING","S3_DELETE_ERROR","S3_DELETED"],"title":"ResourceVersionStatus","description":"Enumeration for the possible status of a resource version."},"RoleEnum":{"type":"string","enum":["administrator","user","reviewer","developer","db_maintainer"],"title":"RoleEnum"},"S3Key":{"properties":{"uid":{"type":"string","title":"Uid","description":"UID of the user of that access key","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"access_key":{"type":"string","title":"Access Key","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"]},"secret_key":{"type":"string","title":"Secret Key","description":"Secret of the S3 access key","examples":["2F5uNTI1qvt4oAroXV0wWct8rWclL2QvFXKqSqjS"]}},"type":"object","required":["uid","access_key","secret_key"],"title":"S3Key","description":"Schema for a S3 key associated with a user."},"UserIn":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","examples":[["user"]]},"email":{"type":"string","format":"email","title":"Email","description":"Email of the user","examples":["user@example.org"]}},"type":"object","required":["display_name","email"],"title":"UserIn"},"UserOut":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["display_name","uid"],"title":"UserOut","description":"Schema for a user."},"UserOutExtended":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]},"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"lifescience_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lifescience Id","description":"Lifesicence ID of the user","examples":["18b59678f16d2c59306c0aedb1dc7ddcfe162456'"]},"invitation_token_created_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invitation Token Created At","description":"Timestamp when the invitation token was created as UNIX timestamp"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email","description":"Email of the user","examples":["user@example.org"]},"gravatar_url":{"type":"string","minLength":1,"format":"uri","title":"Gravatar Url","description":"URL to the gravatar avatar based on the users email","readOnly":true,"examples":["https://gravatar.com/avatar/87a8c45825eb709ee8e453d2c0f8154e1b9bf4b45bb9b81b7662177340aa9d38"]}},"type":"object","required":["roles","display_name","uid","gravatar_url"],"title":"UserOutExtended"},"UserRequestAnswer":{"properties":{"deny":{"type":"boolean","title":"Deny","description":"Flag to indicate if the request was denied.","default":false},"reason":{"anyOf":[{"type":"string","maxLength":512,"minLength":16},{"type":"null"}],"title":"Reason","description":"Reason why the request was denied or approved. Required if request is denied."}},"type":"object","title":"UserRequestAnswer"},"UserRoles":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]}},"type":"object","required":["roles"],"title":"UserRoles"},"UserSynchronizationRequestIn":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]}},"type":"object","required":["reason"],"title":"UserSynchronizationRequestIn"},"UserSynchronizationRequestOut":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"requester_id":{"type":"string","title":"Requester Id","description":"ID of the user that requested this resource synchronization","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["reason","resource_version_id","resource_id","requester_id"],"title":"UserSynchronizationRequestOut"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WorkflowCredentialsIn":{"properties":{"token":{"type":"string","maxLength":128,"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","required":["token"],"title":"WorkflowCredentialsIn"},"WorkflowCredentialsOut":{"properties":{"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","title":"WorkflowCredentialsOut"},"WorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["parameters","workflow_version_id"],"title":"WorkflowExecutionIn"},"WorkflowExecutionOut":{"properties":{"workflow_version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"execution_id":{"type":"string","title":"Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"executor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executor Id","description":"UID of user who started the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"start_time":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Start Time","description":"Start time of the workflow execution as UNIX timestamp","examples":[1640991600]},"end_time":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"End Time","description":"End time of the workflow execution as UNIX timestamp","examples":[1640991600]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"Status of the workflow execution","examples":["RUNNING"]},"workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Id","description":"Id of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"logs_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where logs and reports are saved.","examples":["s3://example-bucket/logs/run-591b6a6ea1f0420d8a20a7a60704f695"]},"provenance_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where provenance information is saved.","examples":["s3://example-bucket/provenance/run-591b6a6ea1f0420d8a20a7a60704f695"]},"debug_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where debug information from Nextflow is saved.","examples":["s3://example-bucket/debug/run-591b6a6ea1f0420d8a20a7a60704f695"]},"cpu_time":{"type":"string","format":"duration","title":"Cpu Time","description":"The consumed cpu time in ISO 8601 format","examples":["P4DT12H30M5S"]}},"type":"object","required":["execution_id","start_time","status","cpu_time"],"title":"WorkflowExecutionOut"},"WorkflowExecutionStatus":{"type":"string","enum":["PENDING","SCHEDULED","RUNNING","CANCELED","SUCCESS","ERROR"],"title":"WorkflowExecutionStatus","description":"Enumeration for the status on a workflow execution."},"WorkflowIn":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"initial_version":{"type":"string","maxLength":10,"minLength":5,"title":"Initial Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","maxItems":10,"title":"Modes","description":"List of modes with alternative entrypoint the new workflow has","default":[]},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["name","short_description","repository_url","git_commit_hash","initial_version","nextflow_version"],"title":"WorkflowIn"},"WorkflowModeIn":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]}},"type":"object","required":["schema_path","entrypoint","name"],"title":"WorkflowModeIn"},"WorkflowModeOut":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]},"mode_id":{"type":"string","title":"Mode Id","description":"ID of the workflow mode","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["schema_path","entrypoint","name","mode_id"],"title":"WorkflowModeOut"},"WorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"versions":{"items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"type":"array","title":"Versions","description":"Versions of the workflow"},"developer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Developer Id","description":"ID of developer of the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"private":{"type":"boolean","title":"Private","description":"Flag if the workflow is hosted in a private git repository","default":false}},"type":"object","required":["name","short_description","repository_url","workflow_id","versions"],"title":"WorkflowOut"},"WorkflowStatistic":{"properties":{"day":{"type":"string","format":"date","title":"Day","description":"Day of the datapoint","examples":["2023-01-01"]},"count":{"type":"integer","title":"Count","description":"Number of started workflows on that day","examples":[1]}},"type":"object","required":["day","count"],"title":"WorkflowStatistic"},"WorkflowUpdate":{"properties":{"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"append_modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","title":"Append Modes","description":"Add modes to the new workflow version"},"delete_modes":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Delete Modes","description":"Delete modes for the new workflow version.","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["version","git_commit_hash"],"title":"WorkflowUpdate"},"WorkflowVersionMetadataIn":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataIn"},"WorkflowVersionMetadataOut":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataOut"},"WorkflowVersionOut":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the corresponding workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1640991600]},"modes":{"items":{"type":"string"},"type":"array","title":"Modes","description":"Optional modes his workflow version has","default":[],"examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"parameter_extension":{"anyOf":[{"$ref":"#/components/schemas/ParameterExtension-Output"},{"type":"null"}],"description":"Parameter extension specific for this CloWM instance"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["status","workflow_id","version","workflow_version_id","created_at","nextflow_version"],"title":"WorkflowVersionOut"},"WorkflowVersionStatus":{"type":"string","enum":["CREATED","DENIED","PUBLISHED","DEPRECATED"],"title":"WorkflowVersionStatus","description":"Enumeration for the possible status of a workflow version."},"WorkflowVersionStatusSchema":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]}},"type":"object","required":["status"],"title":"WorkflowVersionStatusSchema"}},"securitySchemes":{"Session Token":{"type":"apiKey","description":"The JWT in this cookie is used by the website and should not be used when communicating directly with the API.","in":"cookie","name":"clowm-jwt"}}}} \ No newline at end of file +{"openapi":"3.1.0","info":{"title":"CloWM UI API","description":"This is the API for the CloWM UI. It is only for internal use and will change without prior notice.","version":"1.0"},"servers":[{"url":"/api"}],"paths":{"/auth/login/{provider}":{"get":{"tags":["Auth"],"summary":"Kickstart the login flow","description":"Redirect route to OIDC provider to kickstart the login process.","operationId":"Auth-kickstart_login","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider","description":"The OIDC provider to use for login"},"description":"The OIDC provider to use for login"},{"name":"invitation_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":43,"maxLength":43},{"type":"null"}],"description":"Unique token to validate an invitation","title":"Invitation Token"},"description":"Unique token to validate an invitation"},{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Will be appended to redirect response in the callback route as URL query parameter `next`","title":"Next"},"description":"Will be appended to redirect response in the callback route as URL query parameter `next`"}],"responses":{"302":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login/callback/{provider}":{"get":{"tags":["Auth"],"summary":"LifeScience Login Callback","description":"Callback for the login process with an OIDC Provider.\n\nVisit the route login route to start the login process.\n\nIf the user is already known to the system, then a JWT token will be created and sent via the 'set-cookie' header.\nThe key for this Cookie is 'bearer'.\n\nIf the user is new, he will be created him and then a JWT token is issued.\n\nThis JWT has to be sent to all authorized endpoints via the HTTPBearer scheme.","operationId":"Auth-login_callback","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider"}}],"responses":{"302":{"description":"Successful Response","headers":{"Set-Cookie":{"description":"JWT for accessing the API","schema":{"type":"string","example":"clowm-jwt=fake-jwt-cookie; Domain=localhost; Max-Age=691200; Path=/; SameSite=strict; Secure"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/account/connect/{provider}":{"get":{"tags":["Auth"],"summary":"Kickstart the account connection flow","description":"Redirect route to OIDC provider to connect the CloWM account with the AAI account.","operationId":"Auth-kickstart_account_connection","security":[{"Session Token":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider","description":"The OIDC provider to use for login"},"description":"The OIDC provider to use for login"}],"responses":{"302":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/account/callback/{provider}":{"get":{"tags":["Auth"],"summary":"LifeScience Login Callback","description":"Callback for the account connection process with an OIDC provider.","operationId":"Auth-account_connection_callback","security":[{"Session Token":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider"}}],"responses":{"302":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"get":{"tags":["Auth"],"summary":"Logout","description":"Logout the user from the system by deleting the bearer cookie.","operationId":"Auth-logout","responses":{"302":{"description":"Successful Response","headers":{"Set-Cookie":{"description":"JWT for accessing the API","schema":{"type":"string","example":"clowm-jwt=; Domain=localhost; Max-Age=0; Path=/; SameSite=strict; Secure"}}}}}}},"/ui/tokens":{"get":{"tags":["APIToken"],"summary":"List API token","description":"List meta information about all API token.\n\nPermissions `api_token:list_all` required. See parameter `uid` for exception.","operationId":"APIToken-list_token","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiTokenOut"},"title":"Response Apitoken-List Token"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["APIToken"],"summary":"Create new API token","description":"Create a new API token for the current user.\n\nPermission `api_token:create` required.","operationId":"APIToken-create_token","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenIn","description":"Meta-data for Api token to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenPrivateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/tokens/{tid}":{"get":{"tags":["APIToken"],"summary":"Get API token","description":"Get an API token by id.\n\nPermission `api_token:read` required if the current user is the owner of the API token,\notherwise `api_token:read_any` required.","operationId":"APIToken-get_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["APIToken"],"summary":"Delete API token","description":"Delete an API token by id.\n\nPermission `api_token:delete` required if the current user is the owner of the API token,\notherwise `api_token:delete_any` required.","operationId":"APIToken-delete_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users":{"post":{"tags":["User"],"summary":"Create User","description":"Create a new user in the system and notify him.\n\nPermission `user:create` required.","operationId":"User-create_user","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserIn","description":"Meta-data for user to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["User"],"summary":"List users and search by their name","description":"List all users in the system..\n\nPermission `user:list` required.","operationId":"User-list_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter users by a substring in their name.","examples":["Bilbo"],"title":"Name Substring"},"description":"Filter users by a substring in their name."},{"name":"filter_roles","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/RoleEnum"}},{"type":"null"}],"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression.","title":"Filter Roles"},"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOutExtended"},"title":"Response User-List Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/search":{"get":{"tags":["User"],"summary":"Search Users","description":"Search for users in the system by their name.\n\nPermission `user: search` required.","operationId":"User-search_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":30,"description":"Filter users by a substring in their name.","title":"Name Substring"},"description":"Filter users by a substring in their name."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOut"},"title":"Response User-Search Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/me":{"get":{"tags":["User"],"summary":"Get the logged in user","description":"Return the user associated with the used JWT.\n\nPermission `user:read` required.","operationId":"User-get_logged_in_user","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}}},"security":[{"Session Token":[]}]}},"/ui/users/{uid}":{"get":{"tags":["User"],"summary":"Get a user by its uid","description":"Return the user with the specific uid.\n\nPermission `user:read` required.","operationId":"User-get_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["User"],"summary":"Delete a user","description":"Delete a user and his S3 account.\n\nPermission `user:delete` required if the current user is the target user.","operationId":"User-delete_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/roles":{"put":{"tags":["User"],"summary":"Update user roles","description":"Update the roles of a user.\n\nPermission `user:update` required.","operationId":"User-update_roles","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRoles","description":"The new roles of the user"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/invitation":{"patch":{"tags":["User"],"summary":"Resend Invitation","description":"Resend the invitation link for an user that has an open invitation.\n\nPermission `user:create` required.","operationId":"User-resend_invitation","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys":{"get":{"tags":["S3Key"],"summary":"Get the S3 Access keys from a user","description":"Get all the S3 Access keys for a specific user.\n\nPermission `s3_key:list` required if the current user is the target, otherwise `s3_key:list_all` required.","operationId":"S3Key-get_user_keys","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/S3Key"},"title":"Response S3Key-Get User Keys"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["S3Key"],"summary":"Create a Access key for a user","description":"Create a S3 Access key for a specific user.\n\nPermission `s3_key:create` required if the current user is the target, otherwise `s3_key:create_any` required.","operationId":"S3Key-create_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys/{access_id}":{"get":{"tags":["S3Key"],"summary":"Get a specific S3 Access key from a user","description":"Get a specific S3 Access Key for a specific user.\n\nPermission `s3_key:read` required if the current user is the target, otherwise `s3_key:read_any` required.","operationId":"S3Key-get_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["S3Key"],"summary":"Delete a specific S3 Access key from a user","description":"Delete a specific S3 Access key for a specific user.\n\nPermission `s3_key:delete` required if the current user is the target, otherwise `s3_key:delete_any` required.","operationId":"S3Key-delete_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets":{"get":{"tags":["Bucket"],"summary":"List buckets","description":"List all the buckets in the system or of the desired user where the user has permissions for.\n\nPermission `bucket:list_all` required. See parameter `owner_id` for exception.","operationId":"Bucket-list_buckets","security":[{"Session Token":[]}],"parameters":[{"name":"owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Owner Id"},"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target."},{"name":"bucket_type","in":"query","required":false,"schema":{"$ref":"#/components/schemas/BucketType","description":"Type of the bucket to get. Ignored when `user` parameter not set","default":"ALL"},"description":"Type of the bucket to get. Ignored when `user` parameter not set"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketOut"},"title":"Response Bucket-List Buckets"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket for the current user","description":"Create a bucket for the current user.\n\nThe name of the bucket has some constraints.\nFor more information see the\n[Ceph documentation](https://docs.ceph.com/en/quincy/radosgw/s3/bucketops/#constraints)\n\nPermission `bucket:create` required.","operationId":"Bucket-create_bucket","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketIn","description":"Meta-data for bucket to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"List bucket OTRs","description":"Get the ownership transfer requests for buckets.\n\nPermission `bucket:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `bucket:list_all`","operationId":"Bucket-list_bucket_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Bucket-List Bucket Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}":{"get":{"tags":["Bucket"],"summary":"Get a bucket by its name","description":"Get a bucket by its name if the current user has READ permissions for the bucket.\n\nPermission `bucket:read` required if the current user is the owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket","description":"Delete a bucket by its name. Only the owner of the bucket can delete the bucket.\n\nPermission `bucket:delete` required if the current user is the owner of the bucket,\notherwise `bucket:delete_any` required.","operationId":"Bucket-delete_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"force_delete","in":"query","required":false,"schema":{"type":"boolean","description":"Delete even non-empty bucket","default":false,"title":"Force Delete"},"description":"Delete even non-empty bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"Get a bucket OTR","description":"Get a specific bucket ownership transfer request.\n\nPermission `bucket:read` required if the current user is the current or new owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket OTR","description":"Create a ownership transfer request for a specific bucket.\n\nPermission `bucket:update` required if the current user is the current owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-create_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the bucket OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Bucket"],"summary":"Accept a bucket OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `bucket:update` required if the current user is the new owner of the workflow,\notherwise `bucket:update_any` required.","operationId":"Bucket-accept_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket OTR","description":"Delete/Reject a bucket ownership transfer request.\n\nPermission `bucket:update` required if the current user is the current or new owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-delete_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/public":{"patch":{"tags":["Bucket"],"summary":"Update public status","description":"Update the buckets public state.\n\nPermission `bucket:update` required if the current user is the owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-update_bucket_public_state","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_Bucket-update_bucket_public_state"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/limits":{"patch":{"tags":["Bucket"],"summary":"Update bucket limits","description":"Update the buckets size limits.\n\nPermission `bucket:update_any` required.","operationId":"Bucket-update_bucket_limits","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketSizeLimits","description":"New size limits for bucket"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions.","description":"List all the bucket permissions in the system.\n\nPermission `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions","security":[{"Session Token":[]}],"parameters":[{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["BucketPermission"],"summary":"Create a permission.","description":"Create a permission for a bucket and user.\n\nPermission `bucket_permission:create` required.","operationId":"BucketPermission-create_permission","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionIn","description":"Permission to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a user.","description":"List all the bucket permissions for the given user.\n\nPermission `bucket_permission:list` required if current user is the target the bucket permission,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per User"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a bucket.","description":"List all the bucket permissions for the given bucket.\n\nPermission `bucket_permission:list` required if current user is owner of the bucket,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per Bucket"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get permission for bucket and user combination.","description":"Get the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:read` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:read_any` required.","operationId":"BucketPermission-get_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["BucketPermission"],"summary":"Update a bucket permission","description":"Update a permission for a bucket and user.\n\nPermission `bucket_permission:update` required.","operationId":"BucketPermission-update_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionParameters","description":"Permission to create"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["BucketPermission"],"summary":"Delete a bucket permission","description":"Delete the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:delete` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:delete_any` required.","operationId":"BucketPermission-delete_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows":{"post":{"tags":["Workflow"],"summary":"Create a new workflow","description":"Create a new workflow.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow-create_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowIn","description":"Meta-date for the workflow to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow"],"summary":"List workflows","description":"List all workflows.\n\nPermission `workflow:list` required.","operationId":"Workflow-list_workflows","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter workflows by a substring in their name.","examples":["blast"],"title":"Name Substring"},"description":"Filter workflows by a substring in their name."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`.","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`."},{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowOut"},"title":"Response Workflow-List Workflows"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"List workflow OTRs","description":"Get the ownership transfer requests for workflows.\n\nPermission `workflow:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `workflow:list_all`","operationId":"Workflow-list_workflow_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Workflow-List Workflow Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/developer_statistics":{"get":{"tags":["Workflow"],"summary":"Get anonymized workflow execution","description":"Get the workflow executions with meta information and anonymized user IDs.\n\nPermission `workflow:read` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:read_any`.","operationId":"Workflow-get_developer_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter by the developer of the workflows","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter by the developer of the workflows"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"description":"Filter by workflow IDs","title":"Workflow Id"},"description":"Filter by workflow IDs"},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions after this date","title":"Start"},"description":"Filter by workflow executions after this date"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions before this date","title":"End"},"description":"Filter by workflow executions before this date"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnonymizedWorkflowExecution"},"title":"Response Workflow-Get Developer Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}":{"get":{"tags":["Workflow"],"summary":"Get a workflow","description":"Get a specific workflow.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow","description":"Delete a workflow.\n\nPermission `workflow:delete` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:delete_any`.","operationId":"Workflow-delete_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"Get a workflow OTR","description":"Get a specific workflow ownership transfer request.\n\nPermission `workflow:read` required if current user is the current or new owner of the workflow,\notherwise `workflow:read_any` required.","operationId":"Workflow-get_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Workflow"],"summary":"Create a workflow OTR","description":"Create a ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the current owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-create_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for workflow OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Workflow"],"summary":"Accept a workflow OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-accept_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow OTR","description":"Delete/Reject a workflow ownership transfer request.\n\nPermission `workflow:update` required if current user is the current or new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-delete_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/statistics":{"get":{"tags":["Workflow"],"summary":"Get statistics for a workflow","description":"Get the number of started workflow per day.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowStatistic"},"title":"Response Workflow-Get Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/update":{"post":{"tags":["Workflow"],"summary":"Update a workflow","description":"Create a new workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow-update_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdate","description":"Meta-data for the workflow version to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions":{"get":{"tags":["Workflow Version"],"summary":"Get all versions of a workflow","description":"List all versions of a Workflow.\n\nPermission `workflow:list` required.","operationId":"Workflow Version-list_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"title":"Response Workflow Version-List Workflow Version"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}":{"get":{"tags":["Workflow Version"],"summary":"Get a workflow version","description":"Get a specific version of a workflow.\n\nPermission `workflow:read` required if the version is public or you are the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit `git_commit_hash` of specific version or `latest`.","examples":["latest","ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit `git_commit_hash` of specific version or `latest`."},{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/status":{"patch":{"tags":["Workflow Version"],"summary":"Update status of workflow version","description":"Update the status of a workflow version.\n\nPermission `workflow:update_status`","operationId":"Workflow Version-update_workflow_version_status","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionStatusSchema","description":"New Status of the workflow version"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/metadata":{"get":{"tags":["Workflow Version"],"summary":"Get metadata of workflow version","description":"Get the metadata of a workflow version.\n\nPermission `workflow:read` required if the current user is the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Version"],"summary":"Update metadata of workflow version","description":"Update the metadata of a workflow version.\n\nPermission `workflow:update` required if the current user is the developer of the workflow,\notherwise `workflow:update_any`","operationId":"Workflow Version-update_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/deprecate":{"patch":{"tags":["Workflow Version"],"summary":"Deprecate a workflow version","description":"Deprecate a workflow version.\n\nPermission `workflow:update` required if you are the developer of the workflow,\notherwise `workflow:update_status`","operationId":"Workflow Version-deprecate_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/parameter-extension":{"patch":{"tags":["Workflow Version"],"summary":"Update parameter extension of workflow version","description":"Update the parameter extension of a workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-update_workflow_version_parameter_extension","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParameterExtension-Input","description":"Parameter extension specific for this CloWM instance"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/documentation":{"get":{"tags":["Workflow Version"],"summary":"Fetch documentation for a workflow version","description":"Get the documentation for a specific workflow version.\nStreams the response directly from the right git repository.\n\nPermission `workflow:read` required.","operationId":"Workflow Version-download_workflow_documentation","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."},{"name":"document","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DocumentationEnum","description":"Specify which type of documentation the client wants to fetch","default":"usage.md"},"description":"Specify which type of documentation the client wants to fetch"},{"name":"mode_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Workflow Mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"Workflow Mode"}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/icon":{"post":{"tags":["Workflow Version"],"summary":"Upload icon for workflow version","description":"Upload an icon for the workflow version and returns the new icon URL.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-upload_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_Workflow_Version-upload_workflow_version_icon"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IconUpdateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Version"],"summary":"Delete icon of workflow version","description":"Delete the icon of the workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-delete_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions":{"post":{"tags":["Workflow Execution"],"summary":"Start a new workflow execution","description":"Start a new workflow execution. Workflow versions wit status `DEPRECATED` or `DENIED` can't be started.\n\nPermission `workflow_execution:create` required if workflow versions status is `PUBLISHED`,\notherwise `workflow_execution:create_any` required.","operationId":"Workflow Execution-start_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow Execution"],"summary":"List all workflow executions","description":"Get all workflow executions.\n\nThis endpoint enforces keyset pagination. To iterate over all workflow executions, follow the link provided in the\n`Link` header.\nA missing `Link` header indicates that you iterated over all workflow executions with the current filters.\n\nPermission `workflow_execution:list` required, if `executor_id` is the same as the current user,\notherwise `workflow_execution:list_all` required.","operationId":"Workflow Execution-list_workflow_executions","security":[{"Session Token":[]}],"parameters":[{"name":"executor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Executor Id"},"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required."},{"name":"execution_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionStatus"}},{"type":"null"}],"description":"Filter for status of workflow execution","title":"Execution Status"},"description":"Filter for status of workflow execution"},{"name":"workflow_version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":40,"maxLength":40,"pattern":"^[0-9a-f]+$"},{"type":"null"}],"description":"Filter for workflow version","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Workflow Version Id"},"description":"Filter for workflow version"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Workflow Id"},"description":"Filter for workflow"},{"name":"start_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started after this UNIX timestamp","examples":[1640991600],"title":"Start After"},"description":"Filter for workflow executions that started after this UNIX timestamp"},{"name":"start_before","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started before this UNIX timestamp","examples":[1640991600],"title":"Start Before"},"description":"Filter for workflow executions that started before this UNIX timestamp"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionOut"},"title":"Response Workflow Execution-List Workflow Executions"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<https://dev.clowm.de/api/workflow_executions?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/arbitrary":{"post":{"tags":["Workflow Execution"],"summary":"Start a workflow execution with arbitrary git repository","description":"Start a new workflow execution from an arbitrary git repository.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow Execution-start_arbitrary_workflow","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevWorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Session Token":[]}]}},"/ui/workflow_executions/{eid}":{"get":{"tags":["Workflow Execution"],"summary":"Get a workflow execution","description":"Get a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Execution"],"summary":"Delete a workflow execution","description":"Delete a specific workflow execution.\n\nPermission `workflow_execution:delete` required if the current user started the workflow execution,\notherwise `workflow_execution:delete_any` required.","operationId":"Workflow Execution-delete_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/params":{"get":{"tags":["Workflow Execution"],"summary":"Get the parameters of a workflow execution","description":"Get the parameters of a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution_params","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Workflow Execution-Get Workflow Execution Params"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/cancel":{"post":{"tags":["Workflow Execution"],"summary":"Cancel a workflow execution","description":"Cancel a running workflow execution.\n\nPermission `workflow_execution:cancel` required if the current user started the workflow execution,\notherwise `workflow_execution:cancel_any` required.","operationId":"Workflow Execution-cancel_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/credentials":{"get":{"tags":["Workflow Credentials"],"summary":"Get the credentials of a workflow","description":"Get the credentials for the repository of a workflow. Only the developer of a workflow can do this.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-get_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Credentials"],"summary":"Update the credentials of a workflow","description":"Update the credentials for the repository of a workflow.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-update_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsIn","description":"Updated credentials for the workflow git repository"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Credentials"],"summary":"Delete the credentials of a workflow","description":"Delete the credentials for the repository of a workflow.\n\nPermission `workflow:delete` required if the developer of the workflow is the same as the current user,\nother `workflow:delete_any`.","operationId":"Workflow Credentials-delete_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_modes/{mode_id}":{"get":{"tags":["Workflow Mode"],"summary":"Get workflow mode","description":"Get a workflow mode.\n\nPermission `workflow:read` required","operationId":"Workflow Mode-get_workflow_mode","security":[{"Session Token":[]}],"parameters":[{"name":"mode_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"ID of a workflow mode"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowModeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources":{"post":{"tags":["Resource"],"summary":"Request a new resource","description":"Request a new resources.\n\nPermission `resource:create` required.","operationId":"Resource-create_resource","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceIn","description":"Meta-data for the resource to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Resource"],"summary":"List resources","description":"List all resources.\n\nPermission `resource:list` required.","operationId":"Resource-list_resources","security":[{"Session Token":[]}],"parameters":[{"name":"maintainer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Maintainer Id"},"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required."},{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"description":"Filter resources by a substring in their name.","examples":["gtdb"],"title":"Name Substring"},"description":"Filter resources by a substring in their name."},{"name":"public","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter resources to by the public flag","title":"Public"},"description":"Filter resources to by the public flag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceOut"},"title":"Response Resource-List Resources"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/sync_requests":{"get":{"tags":["Resource"],"summary":"List resource sync requests","description":"List all resource sync requests.\n\nPermission `resource:update_any` required.","operationId":"Resource-list_sync_requests","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UserSynchronizationRequestOut"},"type":"array","title":"Response Resource-List Sync Requests"}}}}},"security":[{"Session Token":[]}]}},"/ui/resources/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"List resource OTRs","description":"Get the ownership transfer requests for resources.\n\nPermission `resource:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `resource:list_all`","operationId":"Resource-list_resource_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Resource-List Resource Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}":{"get":{"tags":["Resource"],"summary":"Get a resource","description":"Get a specific resource.\n\nPermission `resource:read` required.","operationId":"Resource-get_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource","description":"Delete a resources.\n\nPermission `resource:delete` required.","operationId":"Resource-delete_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"Get a resource OTR","description":"Get a specific resource ownership transfer request.\n\nPermission `resource:read` required if the current user is the current or new owner of the resource,\notherwise `resource:read_any` required.","operationId":"Resource-get_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Resource"],"summary":"Create a resource OTR","description":"Create a ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the current owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-create_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the resource OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Resource"],"summary":"Accept a resource OTR","description":"Accept an ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-accept_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource OTR","description":"Delete/Reject a resource ownership transfer request.\n\nPermission `resource:update` required if the current user is the current or new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-delete_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions":{"get":{"tags":["ResourceVersion"],"summary":"List versions of a resource","description":"List all the resource version for a specific resource.\n\nPermission 'resource:read' required.","operationId":"ResourceVersion-list_resource_versions","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionOut"},"title":"Response Resourceversion-List Resource Versions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["ResourceVersion"],"summary":"Request new version of a resource","description":"Request a new resource version.\n\nPermission `resource:update` required if the current user is the maintainer, `resource:update_any` otherwise.","operationId":"ResourceVersion-request_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionIn","description":"Meta-data for the resource version to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}":{"get":{"tags":["ResourceVersion"],"summary":"Get version of a resource","description":"Get a specific resource version for a specific resource.\n\nPermission `resource:read` required. If the status of the resource version is not `LATEST` or `SYNCHRONIZED` and\nthe current user is not the maintainer, then the permission `resource:read_any` is required.","operationId":"ResourceVersion-get_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/tree":{"get":{"tags":["ResourceVersion"],"summary":"Download folder structure of resource","description":"Get the folder structure of the resources. Only available if the resource was previously downloaded to the cluster.\n\nPermission `resource:read` required.","operationId":"ResourceVersion-resource_file_tree","security":[{"Session Token":[]}],"parameters":[{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"},{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FileTree"},"title":"Response Resourceversion-Resource File Tree"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_review":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version review","description":"Request the review of a resource version.\n\nPermission `resource:update` required.","operationId":"ResourceVersion-request_resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_sync":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version synchronization","description":"Request the synchronization of a resource version to the cluster.\n\nPermission `resource:request_sync` required.","operationId":"ResourceVersion-request_resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSynchronizationRequestIn","description":"Meta-data for the synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/review":{"put":{"tags":["ResourceVersion"],"summary":"Review resource version","description":"Review answer the resource version.\n\nPermission `resource:update_status` required.","operationId":"ResourceVersion-resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer for the resource version review"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/sync":{"put":{"tags":["ResourceVersion"],"summary":"Synchronize resource version with cluster","description":"Synchronize the resource version to the cluster.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer to the resource version synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/latest":{"put":{"tags":["ResourceVersion"],"summary":"Set resource version to latest","description":"Set the resource version as the latest version.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_latest","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/cluster":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version on cluster","description":"Delete the resource version on the cluster.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_cluster","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/s3":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version in S3","description":"Delete the resource version in the S3 bucket.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_s3","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news":{"post":{"tags":["News"],"summary":"Create news","description":"Create a news event.\n\nPermission `news:create` required.","operationId":"News-create_news","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsIn","description":"Meta-data for news event to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["News"],"summary":"List news","description":"List all news events with filters.\n\nThis endpoint enforces keyset pagination. To iterate over all news, follow the link provided in the `Link` header.\nA missing `Link` header indicates that you iterated over all news with the current filters.\n\nPermission `news:list` required.","operationId":"News-list_news","security":[{"Session Token":[]}],"parameters":[{"name":"created_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967296,"minimum":0},{"type":"null"}],"description":"Filter for news that are created after this UNIX timestamp","title":"Created After"},"description":"Filter for news that are created after this UNIX timestamp"},{"name":"creator_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for news created by a specific user","title":"Creator Id"},"description":"Filter for news created by a specific user"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NewsOut"},"title":"Response News-List News"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<https://dev.clowm.de/api/news?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news/latest":{"get":{"tags":["News"],"summary":"Get latest news","description":"List the current news events.\n\nPermission `news:list` required.","operationId":"News-list_latest_news","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NewsOut"},"type":"array","title":"Response News-List Latest News"}}}}},"security":[{"Session Token":[]}]}},"/ui/news/{nid}":{"get":{"tags":["News"],"summary":"Get a specific news","description":"Get a specified news event.\n\nPermission `news:read` required.","operationId":"News-get_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["News"],"summary":"Delete a specific news","description":"Delete a specified news event.\n\nPermission `news:delete` required.","operationId":"News-delete_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/public/workflows":{"get":{"tags":["Public"],"summary":"Get available workflows","description":"Public route to fetch all available workflows.","operationId":"Public-get_public_workflows","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PublicWorkflowOut"},"type":"array","title":"Response Public-Get Public Workflows"}}}}}}}},"components":{"schemas":{"AnonymizedWorkflowExecution":{"properties":{"workflow_execution_id":{"type":"string","title":"Workflow Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"pseudo_uid":{"type":"string","title":"Pseudo Uid","description":"Anonymized user ID of the user who ran the workflow execution","examples":["7ed4249857b656e96f456449796e461e6001d3fb2481a44701f70ca437bd53a2"]},"workflow_mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Mode Id","description":"ID of the workflow mode this workflow execution ran in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"workflow_version_id":{"type":"string","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"started_at":{"type":"string","format":"date","title":"Started At","description":"Day of the workflow execution","examples":["2023-01-01"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"developer_id":{"type":"string","title":"Developer Id","description":"ID of developer of the workflow","examples":["28c5353b8bb34984a8bd4169ba94c606"]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"End status of the workflow execution","examples":["SUCCESS"]}},"type":"object","required":["workflow_execution_id","pseudo_uid","workflow_version_id","started_at","workflow_id","developer_id","status"],"title":"AnonymizedWorkflowExecution"},"ApiTokenIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"}},"type":"object","required":["name","scopes"],"title":"ApiTokenIn"},"ApiTokenOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]}},"type":"object","required":["name","scopes","token_id","uid","created_at"],"title":"ApiTokenOut"},"ApiTokenPrivateOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]},"token":{"type":"string","title":"Token","description":"The actual token used for authentication","examples":["J21NRKUYgyVUgvJ3cIdllS-MMa9ny1UDKFF18aetDvo"]}},"type":"object","required":["name","scopes","token_id","uid","created_at","token"],"title":"ApiTokenPrivateOut"},"Body_Bucket-update_bucket_public_state":{"properties":{"public":{"type":"boolean","title":"Public","description":"New public state"}},"type":"object","required":["public"],"title":"Body_Bucket-update_bucket_public_state"},"Body_Workflow_Version-upload_workflow_version_icon":{"properties":{"icon":{"type":"string","format":"binary","title":"Icon","description":"Icon for the Workflow."}},"type":"object","required":["icon"],"title":"Body_Workflow Version-upload_workflow_version_icon"},"BucketIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]}},"type":"object","required":["name","description"],"title":"BucketIn","description":"Schema for creating a new bucket."},"BucketOut":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]},"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]},"owner_id":{"type":"string","title":"Owner Id","description":"UID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"public":{"type":"boolean","title":"Public","description":"Flag if the bucket is anonymously readable"}},"type":"object","required":["name","description","created_at","owner_id","public"],"title":"BucketOut","description":"Schema for answering a request with a bucket."},"BucketPermissionIn":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","format":"uuid","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionIn"},"BucketPermissionOut":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionOut","description":"Schema for the bucket permissions."},"BucketPermissionParameters":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"}},"type":"object","required":["scopes"],"title":"BucketPermissionParameters","description":"Schema for the parameters of a bucket permission."},"BucketSizeLimits":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]}},"type":"object","title":"BucketSizeLimits","description":"Schema to represent bucket limits."},"BucketType":{"type":"string","enum":["OWN","ALL","PERMISSION"],"title":"BucketType","description":"Enumeration for the type of buckets to fetch from the DB\n\nOWN: Only fetch buckets that the user owns\nPERMISSION: Only fetch foreign buckets that the user has access to\nALL: Fetch all buckets that the user has access to"},"DevWorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"mode":{"anyOf":[{"$ref":"#/components/schemas/WorkflowModeIn"},{"type":"null"}],"description":"Mode of the workflow with an alternative entrypoint"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow execution requires"}},"type":"object","required":["parameters","git_commit_hash","repository_url","nextflow_version"],"title":"DevWorkflowExecutionIn"},"DocumentationEnum":{"type":"string","enum":["usage.md","input.md","output.md","changelog.md","parameter_schema.json","clowm_info.json","CITATIONS.md"],"title":"DocumentationEnum"},"FileTree":{"properties":{"type":{"type":"string","enum":["file","directory","link"],"title":"Type"},"name":{"type":"string","title":"Name"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"},"contents":{"anyOf":[{"items":{"$ref":"#/components/schemas/FileTree"},"type":"array"},{"type":"null"}],"title":"Contents"},"size":{"type":"integer","title":"Size"}},"type":"object","required":["type","name","size"],"title":"FileTree"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IconUpdateOut":{"properties":{"icon_url":{"type":"string","minLength":1,"format":"uri","title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["icon_url"],"title":"IconUpdateOut"},"InstanceSpecificDefaultParameters":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"}]},"type":"object"},"NewsIn":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event","default":"system"}},"type":"object","required":["content","title"],"title":"NewsIn"},"NewsOut":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event"},"news_id":{"type":"string","title":"News Id","description":"ID of the news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"]},"creator_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Id","description":"ID of the creator","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]}},"type":"object","required":["content","title","category","news_id","created_at"],"title":"NewsOut"},"NextflowVersion":{"type":"string","enum":["22.10.0","22.10.1","22.10.2","22.10.3","22.10.4","22.10.5","22.10.6","22.10.7","22.10.8","23.04.0","23.04.1","23.04.2","23.04.3","23.04.4","23.04.5","23.10.0","23.10.1","23.10.2","23.10.3","23.10.4","24.04.1","24.04.2","24.04.3","24.04.4","24.10.0"],"title":"NextflowVersion"},"OIDCProvider":{"type":"string","enum":["lifescience-aai","nfdi-aai"],"title":"OIDCProvider"},"OwnershipTransferRequestIn":{"properties":{"new_owner_uid":{"type":"string","format":"uuid","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Comment","description":"An optional comment for the transfer request","examples":["This is an example comment"]}},"type":"object","required":["new_owner_uid"],"title":"OwnershipTransferRequestIn"},"OwnershipTransferRequestOut":{"properties":{"new_owner_uid":{"type":"string","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"type":"string","title":"Comment","description":"An optional comment for the transfer request","default":"","examples":["This is an example comment"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Time when the ownership transfer was requested as UNIX timestamp","examples":[1640991600]},"current_owner_uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Owner Uid","description":"The current uid of the current owner if he exists","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"target_id":{"type":"string","title":"Target Id","description":"Id of the target that gets its ownership transferred"},"target_name":{"type":"string","title":"Target Name","description":"Name of the target","examples":["example-bucket","Example Workflow","Example Resource"]},"target_description":{"type":"string","title":"Target Description","description":"Description of then target","examples":["Some long description of a target"]},"target_type":{"$ref":"#/components/schemas/OwnershipTypeEnum","description":"Target type of the ownership transfer","examples":["bucket"]}},"type":"object","required":["new_owner_uid","created_at","target_id","target_name","target_description","target_type"],"title":"OwnershipTransferRequestOut"},"OwnershipTypeEnum":{"type":"string","enum":["bucket","workflow","resource"],"title":"OwnershipTypeEnum"},"ParameterExtension-Input":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterExtension-Output":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterVisibility":{"type":"integer","enum":[10,20,30,40],"title":"ParameterVisibility"},"ParameterVisibilityMapping":{"additionalProperties":{"$ref":"#/components/schemas/ParameterVisibility"},"type":"object"},"PermissionStatus":{"type":"string","enum":["ACTIVE","INACTIVE"],"title":"PermissionStatus","description":"Status of a bucket permission. Can be either `ACTIVE` or `INACTIVE`. A permission can only get `INACTIVE` if the\npermission itself has a time limit and the current time is not in the timespan."},"PublicWorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"latest_git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Latest Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"latest_version_tag":{"type":"string","maxLength":10,"minLength":5,"title":"Latest Version Tag","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"developer":{"type":"string","title":"Developer","description":"Name of the developer","default":"","examples":["Bilbo Baggins"]},"latest_version_timestamp":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Latest Version Timestamp","description":"Timestamp when the last version was created as UNIX timestamp","examples":[1640991600]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the workflow icon","readOnly":true,"examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["name","short_description","repository_url","workflow_id","latest_git_commit_hash","latest_version_tag","latest_version_timestamp","icon_url"],"title":"PublicWorkflowOut"},"ResourceIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true}},"type":"object","required":["release","name","description","source"],"title":"ResourceIn"},"ResourceOut":{"properties":{"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"maintainer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Maintainer Id","description":"ID of the maintainer","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"versions":{"items":{"$ref":"#/components/schemas/ResourceVersionOut"},"type":"array","title":"Versions","description":"Versions of the resource"}},"type":"object","required":["name","description","source","resource_id","maintainer_id","versions"],"title":"ResourceOut"},"ResourceVersionIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]}},"type":"object","required":["release"],"title":"ResourceVersionIn"},"ResourceVersionOut":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"status":{"$ref":"#/components/schemas/ResourceVersionStatus","description":"Status of the resource version"},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1672527600]},"compressed_size":{"type":"integer","maximum":1.8446744073709552e+19,"minimum":0.0,"title":"Compressed Size","description":"Size of the compressed resource in bytes","examples":[42097156608]},"cluster_path":{"type":"string","title":"Cluster Path","description":"Path to the resource on the cluster if the resource is synchronized","readOnly":true,"examples":["/vol/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4","/vol/resources/CLDB-0e240ccd/latest"]},"s3_path":{"type":"string","title":"S3 Path","description":"Path to the resource in the S3 Bucket. Not publicly available.","readOnly":true,"examples":["s3://clowm-data/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4/resource.tar.gz"]}},"type":"object","required":["release","status","resource_version_id","resource_id","created_at","compressed_size","cluster_path","s3_path"],"title":"ResourceVersionOut"},"ResourceVersionStatus":{"type":"string","enum":["RESOURCE_REQUESTED","WAIT_FOR_REVIEW","DENIED","APPROVED","SYNC_REQUESTED","SYNCHRONIZING","SYNC_ERROR","SYNCHRONIZED","SETTING_LATEST","LATEST","CLUSTER_DELETING","CLUSTER_DELETE_ERROR","S3_DELETING","S3_DELETE_ERROR","S3_DELETED"],"title":"ResourceVersionStatus","description":"Enumeration for the possible status of a resource version."},"RoleEnum":{"type":"string","enum":["administrator","user","reviewer","developer","db_maintainer"],"title":"RoleEnum"},"S3Key":{"properties":{"uid":{"type":"string","title":"Uid","description":"UID of the user of that access key","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"access_key":{"type":"string","title":"Access Key","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"]},"secret_key":{"type":"string","title":"Secret Key","description":"Secret of the S3 access key","examples":["2F5uNTI1qvt4oAroXV0wWct8rWclL2QvFXKqSqjS"]}},"type":"object","required":["uid","access_key","secret_key"],"title":"S3Key","description":"Schema for a S3 key associated with a user."},"UserIn":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","examples":[["user"]]},"email":{"type":"string","format":"email","title":"Email","description":"Email of the user","examples":["user@example.org"]}},"type":"object","required":["display_name","email"],"title":"UserIn"},"UserOut":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["display_name","uid"],"title":"UserOut","description":"Schema for a user."},"UserOutExtended":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]},"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"lifescience_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lifescience Id","description":"Lifesicence AAI ID of the user","examples":["18b59678f16d2c59306c0aedb1dc7ddcfe162456"]},"nfdi_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nfdi Id","description":"NFDI AAI ID of the user","examples":["18b59678f16d2c59306c0aedb1dc7ddcfe162456"]},"invitation_token_created_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invitation Token Created At","description":"Timestamp when the invitation token was created as UNIX timestamp"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email","description":"Email of the user","examples":["user@example.org"]},"gravatar_url":{"type":"string","minLength":1,"format":"uri","title":"Gravatar Url","description":"URL to the gravatar avatar based on the users email","readOnly":true,"examples":["https://gravatar.com/avatar/87a8c45825eb709ee8e453d2c0f8154e1b9bf4b45bb9b81b7662177340aa9d38"]}},"type":"object","required":["roles","display_name","uid","gravatar_url"],"title":"UserOutExtended"},"UserRequestAnswer":{"properties":{"deny":{"type":"boolean","title":"Deny","description":"Flag to indicate if the request was denied.","default":false},"reason":{"anyOf":[{"type":"string","maxLength":512,"minLength":16},{"type":"null"}],"title":"Reason","description":"Reason why the request was denied or approved. Required if request is denied."}},"type":"object","title":"UserRequestAnswer"},"UserRoles":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]}},"type":"object","required":["roles"],"title":"UserRoles"},"UserSynchronizationRequestIn":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]}},"type":"object","required":["reason"],"title":"UserSynchronizationRequestIn"},"UserSynchronizationRequestOut":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"requester_id":{"type":"string","title":"Requester Id","description":"ID of the user that requested this resource synchronization","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["reason","resource_version_id","resource_id","requester_id"],"title":"UserSynchronizationRequestOut"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WorkflowCredentialsIn":{"properties":{"token":{"type":"string","maxLength":128,"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","required":["token"],"title":"WorkflowCredentialsIn"},"WorkflowCredentialsOut":{"properties":{"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","title":"WorkflowCredentialsOut"},"WorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["parameters","workflow_version_id"],"title":"WorkflowExecutionIn"},"WorkflowExecutionOut":{"properties":{"workflow_version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"execution_id":{"type":"string","title":"Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"executor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executor Id","description":"UID of user who started the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"start_time":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Start Time","description":"Start time of the workflow execution as UNIX timestamp","examples":[1640991600]},"end_time":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"End Time","description":"End time of the workflow execution as UNIX timestamp","examples":[1640991600]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"Status of the workflow execution","examples":["RUNNING"]},"workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Id","description":"Id of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"logs_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where logs and reports are saved.","examples":["s3://example-bucket/logs/run-591b6a6ea1f0420d8a20a7a60704f695"]},"provenance_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where provenance information is saved.","examples":["s3://example-bucket/provenance/run-591b6a6ea1f0420d8a20a7a60704f695"]},"debug_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where debug information from Nextflow is saved.","examples":["s3://example-bucket/debug/run-591b6a6ea1f0420d8a20a7a60704f695"]},"cpu_time":{"type":"string","format":"duration","title":"Cpu Time","description":"The consumed cpu time in ISO 8601 format","examples":["P4DT12H30M5S"]}},"type":"object","required":["execution_id","start_time","status","cpu_time"],"title":"WorkflowExecutionOut"},"WorkflowExecutionStatus":{"type":"string","enum":["PENDING","SCHEDULED","RUNNING","CANCELED","SUCCESS","ERROR"],"title":"WorkflowExecutionStatus","description":"Enumeration for the status on a workflow execution."},"WorkflowIn":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"initial_version":{"type":"string","maxLength":10,"minLength":5,"title":"Initial Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","maxItems":10,"title":"Modes","description":"List of modes with alternative entrypoint the new workflow has","default":[]},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["name","short_description","repository_url","git_commit_hash","initial_version","nextflow_version"],"title":"WorkflowIn"},"WorkflowModeIn":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]}},"type":"object","required":["schema_path","entrypoint","name"],"title":"WorkflowModeIn"},"WorkflowModeOut":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]},"mode_id":{"type":"string","title":"Mode Id","description":"ID of the workflow mode","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["schema_path","entrypoint","name","mode_id"],"title":"WorkflowModeOut"},"WorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"versions":{"items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"type":"array","title":"Versions","description":"Versions of the workflow"},"developer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Developer Id","description":"ID of developer of the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"private":{"type":"boolean","title":"Private","description":"Flag if the workflow is hosted in a private git repository","default":false}},"type":"object","required":["name","short_description","repository_url","workflow_id","versions"],"title":"WorkflowOut"},"WorkflowStatistic":{"properties":{"day":{"type":"string","format":"date","title":"Day","description":"Day of the datapoint","examples":["2023-01-01"]},"count":{"type":"integer","title":"Count","description":"Number of started workflows on that day","examples":[1]}},"type":"object","required":["day","count"],"title":"WorkflowStatistic"},"WorkflowUpdate":{"properties":{"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"append_modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","title":"Append Modes","description":"Add modes to the new workflow version"},"delete_modes":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Delete Modes","description":"Delete modes for the new workflow version.","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["version","git_commit_hash"],"title":"WorkflowUpdate"},"WorkflowVersionMetadataIn":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataIn"},"WorkflowVersionMetadataOut":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataOut"},"WorkflowVersionOut":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the corresponding workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1640991600]},"modes":{"items":{"type":"string"},"type":"array","title":"Modes","description":"Optional modes his workflow version has","default":[],"examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"parameter_extension":{"anyOf":[{"$ref":"#/components/schemas/ParameterExtension-Output"},{"type":"null"}],"description":"Parameter extension specific for this CloWM instance"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["status","workflow_id","version","workflow_version_id","created_at","nextflow_version"],"title":"WorkflowVersionOut"},"WorkflowVersionStatus":{"type":"string","enum":["CREATED","DENIED","PUBLISHED","DEPRECATED"],"title":"WorkflowVersionStatus","description":"Enumeration for the possible status of a workflow version."},"WorkflowVersionStatusSchema":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]}},"type":"object","required":["status"],"title":"WorkflowVersionStatusSchema"}},"securitySchemes":{"Session Token":{"type":"apiKey","description":"The JWT in this cookie is used by the website and should not be used when communicating directly with the API.","in":"cookie","name":"clowm-jwt"}}}} \ No newline at end of file diff --git a/openapi-ts.config.ts b/openapi-ts.config.ts index d9408aa..f5b45af 100644 --- a/openapi-ts.config.ts +++ b/openapi-ts.config.ts @@ -2,7 +2,6 @@ import { defineConfig } from "@hey-api/openapi-ts"; export default defineConfig({ input: "./openapi-clowm.json", - experimentalParser: false, output: { lint: "eslint", format: "prettier", diff --git a/package-lock.json b/package-lock.json index c09f06b..ea13ca0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@aws-sdk/lib-storage": "<3.729.0", "@aws-sdk/s3-request-presigner": "<3.729.0", "@fortawesome/fontawesome-free": "~6.7.0", - "@hey-api/client-axios": "0.5.2", + "@hey-api/client-axios": "0.6.0", "@popperjs/core": "~2.11.8", "ajv": "~8.17.0", "bootstrap": "~5.3.0", @@ -35,7 +35,7 @@ }, "devDependencies": { "@eslint/compat": "^1.2.0", - "@hey-api/openapi-ts": "^0.63.0", + "@hey-api/openapi-ts": "^0.64.0", "@rushstack/eslint-patch": "~1.10.0", "@tsconfig/node22": "^22.0.0", "@types/bootstrap": "~5.2.0", @@ -55,7 +55,7 @@ "prettier": "~3.4.0", "sass": "^1.66.0", "typescript": "~5.7.0", - "vite": "~6.0.0", + "vite": "~6.1.0", "vite-plugin-node-polyfills": "^0.23.0", "vue-tsc": "~2.2.0" } @@ -331,19 +331,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/client-sso": { "version": "3.726.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.726.0.tgz", @@ -446,32 +433,6 @@ "@aws-sdk/client-sts": "^3.726.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/client-sts": { "version": "3.726.1", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.726.1.tgz", @@ -523,19 +484,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/core": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.723.0.tgz", @@ -558,19 +506,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/credential-provider-env": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.723.0.tgz", @@ -587,19 +522,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/credential-provider-http": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.723.0.tgz", @@ -621,19 +543,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/credential-provider-ini": { "version": "3.726.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.726.0.tgz", @@ -660,19 +569,6 @@ "@aws-sdk/client-sts": "^3.726.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/credential-provider-node": { "version": "3.726.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.726.0.tgz", @@ -696,19 +592,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/credential-provider-process": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.723.0.tgz", @@ -726,19 +609,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/credential-provider-sso": { "version": "3.726.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.726.0.tgz", @@ -758,19 +628,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.723.0.tgz", @@ -790,19 +647,6 @@ "@aws-sdk/client-sts": "^3.723.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/lib-storage": { "version": "3.726.1", "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.726.1.tgz", @@ -842,19 +686,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/middleware-expect-continue": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.723.0.tgz", @@ -870,19 +701,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-expect-continue/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/middleware-flexible-checksums": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.723.0.tgz", @@ -907,19 +725,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/middleware-host-header": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.723.0.tgz", @@ -935,19 +740,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-host-header/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/middleware-location-constraint": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.723.0.tgz", @@ -962,19 +754,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-location-constraint/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/middleware-logger": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.723.0.tgz", @@ -989,19 +768,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-logger/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.723.0.tgz", @@ -1017,19 +783,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/middleware-sdk-s3": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.723.0.tgz", @@ -1055,19 +808,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/middleware-ssec": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.723.0.tgz", @@ -1082,19 +822,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-ssec/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/middleware-user-agent": { "version": "3.726.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.726.0.tgz", @@ -1113,19 +840,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/region-config-resolver": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.723.0.tgz", @@ -1143,19 +857,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/region-config-resolver/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/s3-request-presigner": { "version": "3.726.1", "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.726.1.tgz", @@ -1175,19 +876,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/s3-request-presigner/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/signature-v4-multi-region": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.723.0.tgz", @@ -1205,19 +893,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/token-providers": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.723.0.tgz", @@ -1237,7 +912,7 @@ "@aws-sdk/client-sso-oidc": "^3.723.0" } }, - "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/types": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", @@ -1250,19 +925,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/types": { - "version": "3.734.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.734.0.tgz", - "integrity": "sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/util-arn-parser": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.723.0.tgz", @@ -1290,19 +952,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/util-endpoints/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/util-format-url": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.723.0.tgz", @@ -1318,19 +967,6 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/util-format-url/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/util-locate-window": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.723.0.tgz", @@ -1355,19 +991,6 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/util-user-agent-browser/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/util-user-agent-node": { "version": "3.726.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.726.0.tgz", @@ -1392,19 +1015,6 @@ } } }, - "node_modules/@aws-sdk/util-user-agent-node/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/xml-builder": { "version": "3.723.0", "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.723.0.tgz", @@ -1919,9 +1529,9 @@ } }, "node_modules/@eslint/compat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.5.tgz", - "integrity": "sha512-5iuG/StT+7OfvhoBHPlmxkPA9om6aDUFgmD4+mWKAGsYt4vCe8rypneG03AuseyRHBmcCLXQtIH5S26tIoggLg==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.6.tgz", + "integrity": "sha512-k7HNCqApoDHM6XzT30zGoETj+D+uUcZUb+IVAJmar3u6bvHf7hhHJcWx09QHj4/a2qrKZMWU0E16tvkiAdv06Q==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1937,13 +1547,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", - "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", + "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.5", + "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -2071,9 +1681,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", - "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2104,9 +1714,9 @@ } }, "node_modules/@hey-api/client-axios": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@hey-api/client-axios/-/client-axios-0.5.2.tgz", - "integrity": "sha512-qgaNIjL3Vw2VWz5/J8BLUVkIA4Lb5f48syOtGfL6RK+9TS7Si0T44Z/53VWRhxmJdsrdQ6MCtfKyQEhD5yjh6w==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@hey-api/client-axios/-/client-axios-0.6.0.tgz", + "integrity": "sha512-+wLcSx0K47168Xxx6EzNEWcJjFFAGDEjp9SqKgHg343uls41Ob6EACp/Ouozj4UMP5En+Anq70pDRNDVRY3MVQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/hey-api" @@ -2116,9 +1726,9 @@ } }, "node_modules/@hey-api/json-schema-ref-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@hey-api/json-schema-ref-parser/-/json-schema-ref-parser-1.0.1.tgz", - "integrity": "sha512-dBt0A7op9kf4BcK++x6HBYDmvCvnJUZEGe5QytghPFHnMXPyKwDKomwL/v5e9ERk6E0e1GzL/e/y6pWUso9zrQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@hey-api/json-schema-ref-parser/-/json-schema-ref-parser-1.0.2.tgz", + "integrity": "sha512-F6LSkttZcT/XiX3ydeDqTY3uRN3BLJMwyMTk4kg/ichZlKUp3+3Odv0WokSmXGSoZGTW/N66FROMYAm5NPdJlA==", "dev": true, "license": "MIT", "dependencies": { @@ -2134,13 +1744,13 @@ } }, "node_modules/@hey-api/openapi-ts": { - "version": "0.63.2", - "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.63.2.tgz", - "integrity": "sha512-HC5fR3+07P1AvDYrcZv0kbnhWogvMFot848PfpS3Gbncm47mDdO/uhNGIr2RF9CaRIvJNSJvAf1jL3XAQZ18RA==", + "version": "0.64.1", + "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.64.1.tgz", + "integrity": "sha512-d9FWyJKjyH4KeCjOoR5x8+zKER7h7EIRzk3Xo5a2ShAxNoq9HlAArLbWgJFnH7QypQ+f3q29mTp/z2Zw0XkP9g==", "dev": true, "license": "MIT", "dependencies": { - "@hey-api/json-schema-ref-parser": "1.0.1", + "@hey-api/json-schema-ref-parser": "1.0.2", "c12": "2.0.1", "commander": "13.0.0", "handlebars": "4.7.8" @@ -2674,9 +2284,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.1.tgz", - "integrity": "sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.5.tgz", + "integrity": "sha512-JXmmQcKQtpf3Z6lvA8akkrHDZ5AEfgc2hLMix1/X5BhQbezBQ0AP5GYLdU8jsQRme8qr2sscCe3wizp7UT0L9g==", "cpu": [ "arm" ], @@ -2688,9 +2298,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.1.tgz", - "integrity": "sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.5.tgz", + "integrity": "sha512-9/A8/ZBOprUjkrJoP9BBEq2vdSud6BPd3LChw09bJQiEZH5oN4kWIkHu90cA0Cj0cSF5cIaD76+0lA+d5KHmpQ==", "cpu": [ "arm64" ], @@ -2702,9 +2312,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.1.tgz", - "integrity": "sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.5.tgz", + "integrity": "sha512-b9oCfgHKfc1AJEQ5sEpE8Kf6s7aeygj5bZAsl1hTpZc1V9cfZASFSXzzNj7o/BQNPbjmVkVxpCCLRhBfLXhJ5g==", "cpu": [ "arm64" ], @@ -2716,9 +2326,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.1.tgz", - "integrity": "sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.5.tgz", + "integrity": "sha512-Gz42gKBQPoFdMYdsVqkcpttYOO/0aP7f+1CgMaeZEz0gss7dop1TsO3hT77Iroz/TV7PdPUG/RYlj9EA39L4dw==", "cpu": [ "x64" ], @@ -2730,9 +2340,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.1.tgz", - "integrity": "sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.5.tgz", + "integrity": "sha512-JPkafjkOFaupd8VQYsXfGFKC2pfMr7hwSYGkVGNwhbW0k0lHHyIdhCSNBendJ4O7YlT4yRyKXoms1TL7saO7SQ==", "cpu": [ "arm64" ], @@ -2744,9 +2354,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.1.tgz", - "integrity": "sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.5.tgz", + "integrity": "sha512-j6Q8VFqyI8hZM33h1JC6DZK2w8ejkXqEMozTrtIEGfRVMpVZL3GrLOOYEUkAgUSpJ9sb2w+FEpjGj7IHRcQfdw==", "cpu": [ "x64" ], @@ -2758,9 +2368,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.1.tgz", - "integrity": "sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.5.tgz", + "integrity": "sha512-6jyiXKF9Xq6x9yQjct5xrRT0VghJk5VzAfed3o0hgncwacZkzOdR0TXLRNjexsEXWN8tG7jWWwsVk7WeFi//gw==", "cpu": [ "arm" ], @@ -2772,9 +2382,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.1.tgz", - "integrity": "sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.5.tgz", + "integrity": "sha512-cOTYe5tLcGAvGztRLIqx87LE7j/qjaAqFrrHsPFlnuhhhFO5LSr2AzvdQYuxomJMzMBrXkMRNl9bQEpDZ5bjLQ==", "cpu": [ "arm" ], @@ -2786,9 +2396,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.1.tgz", - "integrity": "sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.5.tgz", + "integrity": "sha512-KHlrd+YqmS7rriW+LBb1kQNYmd5w1sAIG3z7HEpnQOrg/skeYYv9DAcclGL9gpFdpnzmiAEkzsTT74kZWUtChQ==", "cpu": [ "arm64" ], @@ -2800,9 +2410,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.1.tgz", - "integrity": "sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.5.tgz", + "integrity": "sha512-uOb6hzDqym4Sw+qw3+svS3SmwQGVUhyTdPKyHDdlYg1Z0aHjdNmjwRY7zw/90/UfBe/yD7Mv2mYKhQpOfy4RYA==", "cpu": [ "arm64" ], @@ -2814,9 +2424,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.1.tgz", - "integrity": "sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.5.tgz", + "integrity": "sha512-pARu8ZKANZH4wINLdHLKG69EPwJswM6A+Ox1a9LpiclRQoyjacFFTtXN3akKQ2ufJXDasO/pWvxKN9ZfCgEoFA==", "cpu": [ "loong64" ], @@ -2828,9 +2438,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.1.tgz", - "integrity": "sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.5.tgz", + "integrity": "sha512-crUWn12NRmCdao2YwS1GvlPCVypMBMJlexTaantaP2+dAMd2eZBErFcKG8hZYEHjSbbk2UoH1aTlyeA4iKLqSA==", "cpu": [ "ppc64" ], @@ -2842,9 +2452,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.1.tgz", - "integrity": "sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.5.tgz", + "integrity": "sha512-XtD/oMhCdixi3x8rCNyDRMUsLo1Z+1UQcK+oR7AsjglGov9ETiT3TNFhUPzaGC1jH+uaMtPhxrVRUub+pnAKTg==", "cpu": [ "riscv64" ], @@ -2856,9 +2466,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.1.tgz", - "integrity": "sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.5.tgz", + "integrity": "sha512-V3+BvgyHb21aF7lw0sc78Tv0+xLp4lm2OM7CKFVrBuppsMvtl/9O5y2OX4tdDT0EhIsDP/ObJPqDuEg1ZoTwSQ==", "cpu": [ "s390x" ], @@ -2870,9 +2480,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.1.tgz", - "integrity": "sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.5.tgz", + "integrity": "sha512-SkCIXLGk42yldTcH8UXh++m0snVxp9DLf4meb1mWm0lC8jzxjFBwSLGtUSeLgQDsC05iBaIhyjNX46DlByrApQ==", "cpu": [ "x64" ], @@ -2884,9 +2494,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.1.tgz", - "integrity": "sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.5.tgz", + "integrity": "sha512-iUcH3FBtBN2/Ce0rI84suRhD0+bB5BVEffqOwsGaX5py5TuYLOQa7S7oVBP0NKtB5rub3i9IvZtMXiD96l5v0A==", "cpu": [ "x64" ], @@ -2898,9 +2508,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.1.tgz", - "integrity": "sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.5.tgz", + "integrity": "sha512-PUbWd+h/h6rUowalDYIdc9S9LJXbQDMcJe0BjABl3oT3efYRgZ8aUe8ZZDSie7y+fz6Z+rueNfdorIbkWv5Eqg==", "cpu": [ "arm64" ], @@ -2912,9 +2522,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.1.tgz", - "integrity": "sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.5.tgz", + "integrity": "sha512-3vncGhOJiAUR85fnAXJyvSp2GaDWYByIQmW68ZAr+e8kIxgvJ1VaZbfHD5BO5X6hwRQdY6Um/XfA3l5c2lV+OQ==", "cpu": [ "ia32" ], @@ -2926,9 +2536,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.1.tgz", - "integrity": "sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.5.tgz", + "integrity": "sha512-Mi8yVUlQOoeBpY72n75VLATptPGvj2lHa47rQdK9kZ4MoG5Ve86aVIU+PO3tBklTCBtILtdRfXS0EvIbXgmCAg==", "cpu": [ "x64" ], @@ -3711,9 +3321,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.12.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz", - "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", + "version": "22.13.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz", + "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==", "dev": true, "license": "MIT", "dependencies": { @@ -3756,21 +3366,21 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.22.0.tgz", - "integrity": "sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.23.0.tgz", + "integrity": "sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.22.0", - "@typescript-eslint/type-utils": "8.22.0", - "@typescript-eslint/utils": "8.22.0", - "@typescript-eslint/visitor-keys": "8.22.0", + "@typescript-eslint/scope-manager": "8.23.0", + "@typescript-eslint/type-utils": "8.23.0", + "@typescript-eslint/utils": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3786,16 +3396,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.22.0.tgz", - "integrity": "sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.23.0.tgz", + "integrity": "sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.22.0", - "@typescript-eslint/types": "8.22.0", - "@typescript-eslint/typescript-estree": "8.22.0", - "@typescript-eslint/visitor-keys": "8.22.0", + "@typescript-eslint/scope-manager": "8.23.0", + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/typescript-estree": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0", "debug": "^4.3.4" }, "engines": { @@ -3811,14 +3421,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.22.0.tgz", - "integrity": "sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.23.0.tgz", + "integrity": "sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.22.0", - "@typescript-eslint/visitor-keys": "8.22.0" + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3829,16 +3439,16 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.22.0.tgz", - "integrity": "sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.23.0.tgz", + "integrity": "sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.22.0", - "@typescript-eslint/utils": "8.22.0", + "@typescript-eslint/typescript-estree": "8.23.0", + "@typescript-eslint/utils": "8.23.0", "debug": "^4.3.4", - "ts-api-utils": "^2.0.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3853,9 +3463,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.22.0.tgz", - "integrity": "sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.23.0.tgz", + "integrity": "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==", "dev": true, "license": "MIT", "engines": { @@ -3867,20 +3477,20 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.22.0.tgz", - "integrity": "sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.23.0.tgz", + "integrity": "sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.22.0", - "@typescript-eslint/visitor-keys": "8.22.0", + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^2.0.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3894,16 +3504,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.22.0.tgz", - "integrity": "sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.23.0.tgz", + "integrity": "sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.22.0", - "@typescript-eslint/types": "8.22.0", - "@typescript-eslint/typescript-estree": "8.22.0" + "@typescript-eslint/scope-manager": "8.23.0", + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/typescript-estree": "8.23.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3918,13 +3528,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.22.0.tgz", - "integrity": "sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.23.0.tgz", + "integrity": "sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.22.0", + "@typescript-eslint/types": "8.23.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -5711,9 +5321,9 @@ } }, "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", "dev": true, "license": "ISC", "dependencies": { @@ -6206,9 +5816,9 @@ "license": "MIT" }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6779,9 +6389,9 @@ "license": "MIT" }, "node_modules/node-stdlib-browser": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/node-stdlib-browser/-/node-stdlib-browser-1.3.0.tgz", - "integrity": "sha512-g/koYzOr9Fb1Jc+tHUHlFd5gODjGn48tHexUK8q6iqOVriEgSnd3/1T7myBYc+0KBVze/7F7n65ec9rW6OD7xw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-stdlib-browser/-/node-stdlib-browser-1.3.1.tgz", + "integrity": "sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==", "dev": true, "license": "MIT", "dependencies": { @@ -6792,7 +6402,7 @@ "console-browserify": "^1.1.0", "constants-browserify": "^1.0.0", "create-require": "^1.1.1", - "crypto-browserify": "^3.11.0", + "crypto-browserify": "^3.12.1", "domain-browser": "4.22.0", "events": "^3.0.0", "https-browserify": "^1.0.0", @@ -6884,9 +6494,9 @@ "license": "MIT" }, "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -7184,9 +6794,9 @@ "license": "MIT" }, "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, "license": "MIT", "engines": { @@ -7495,9 +7105,9 @@ } }, "node_modules/rollup": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.32.1.tgz", - "integrity": "sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==", + "version": "4.34.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.5.tgz", + "integrity": "sha512-GyVCmpo9z/HYqFD8QWoBUnz1Q9xC22t8tPAZm/AvAcUg2U2/+DkboEvSioMwv042zE4I9N3FEhx7fiCT2YHzKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7511,25 +7121,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.32.1", - "@rollup/rollup-android-arm64": "4.32.1", - "@rollup/rollup-darwin-arm64": "4.32.1", - "@rollup/rollup-darwin-x64": "4.32.1", - "@rollup/rollup-freebsd-arm64": "4.32.1", - "@rollup/rollup-freebsd-x64": "4.32.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.32.1", - "@rollup/rollup-linux-arm-musleabihf": "4.32.1", - "@rollup/rollup-linux-arm64-gnu": "4.32.1", - "@rollup/rollup-linux-arm64-musl": "4.32.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.32.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.32.1", - "@rollup/rollup-linux-riscv64-gnu": "4.32.1", - "@rollup/rollup-linux-s390x-gnu": "4.32.1", - "@rollup/rollup-linux-x64-gnu": "4.32.1", - "@rollup/rollup-linux-x64-musl": "4.32.1", - "@rollup/rollup-win32-arm64-msvc": "4.32.1", - "@rollup/rollup-win32-ia32-msvc": "4.32.1", - "@rollup/rollup-win32-x64-msvc": "4.32.1", + "@rollup/rollup-android-arm-eabi": "4.34.5", + "@rollup/rollup-android-arm64": "4.34.5", + "@rollup/rollup-darwin-arm64": "4.34.5", + "@rollup/rollup-darwin-x64": "4.34.5", + "@rollup/rollup-freebsd-arm64": "4.34.5", + "@rollup/rollup-freebsd-x64": "4.34.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.5", + "@rollup/rollup-linux-arm-musleabihf": "4.34.5", + "@rollup/rollup-linux-arm64-gnu": "4.34.5", + "@rollup/rollup-linux-arm64-musl": "4.34.5", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.5", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.5", + "@rollup/rollup-linux-riscv64-gnu": "4.34.5", + "@rollup/rollup-linux-s390x-gnu": "4.34.5", + "@rollup/rollup-linux-x64-gnu": "4.34.5", + "@rollup/rollup-linux-x64-musl": "4.34.5", + "@rollup/rollup-win32-arm64-msvc": "4.34.5", + "@rollup/rollup-win32-ia32-msvc": "4.34.5", + "@rollup/rollup-win32-x64-msvc": "4.34.5", "fsevents": "~2.3.2" } }, @@ -7596,9 +7206,9 @@ } }, "node_modules/sass": { - "version": "1.83.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.4.tgz", - "integrity": "sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA==", + "version": "1.84.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.84.0.tgz", + "integrity": "sha512-XDAbhEPJRxi7H0SxrnOpiXFQoUJHwkR2u3Zc4el+fK/Tt5Hpzw5kkQ59qVDfvdaUq6gCrEZIbySFBM2T9DNKHg==", "dev": true, "license": "MIT", "dependencies": { @@ -7617,9 +7227,9 @@ } }, "node_modules/semver": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz", - "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -7958,9 +7568,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", - "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", + "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", "dev": true, "license": "MIT", "engines": { @@ -8024,15 +7634,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.22.0.tgz", - "integrity": "sha512-Y2rj210FW1Wb6TWXzQc5+P+EWI9/zdS57hLEc0gnyuvdzWo8+Y8brKlbj0muejonhMI/xAZCnZZwjbIfv1CkOw==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.23.0.tgz", + "integrity": "sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.22.0", - "@typescript-eslint/parser": "8.22.0", - "@typescript-eslint/utils": "8.22.0" + "@typescript-eslint/eslint-plugin": "8.23.0", + "@typescript-eslint/parser": "8.23.0", + "@typescript-eslint/utils": "8.23.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8142,15 +7752,15 @@ } }, "node_modules/vite": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", - "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.0.tgz", + "integrity": "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.24.2", - "postcss": "^8.4.49", - "rollup": "^4.23.0" + "postcss": "^8.5.1", + "rollup": "^4.30.1" }, "bin": { "vite": "bin/vite.js" @@ -8238,9 +7848,9 @@ "license": "MIT" }, "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", "dev": true, "license": "MIT" }, diff --git a/package.json b/package.json index ace26eb..a2f35af 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,8 @@ "type": "module", "license": "Apache-2.0", "scripts": { - "dev": "vite", - "preview": "vite preview --port 5173", + "dev": "vite --host", + "preview": "vite preview --port 5173 --host", "build": "vite build", "type-check": "vue-tsc --noEmit", "lint": "eslint --fix .", @@ -16,7 +16,7 @@ "@aws-sdk/lib-storage": "<3.729.0", "@aws-sdk/s3-request-presigner": "<3.729.0", "@fortawesome/fontawesome-free": "~6.7.0", - "@hey-api/client-axios": "0.5.2", + "@hey-api/client-axios": "0.6.0", "@popperjs/core": "~2.11.8", "ajv": "~8.17.0", "bootstrap": "~5.3.0", @@ -38,7 +38,7 @@ }, "devDependencies": { "@eslint/compat": "^1.2.0", - "@hey-api/openapi-ts": "^0.63.0", + "@hey-api/openapi-ts": "^0.64.0", "@rushstack/eslint-patch": "~1.10.0", "@tsconfig/node22": "^22.0.0", "@types/bootstrap": "~5.2.0", @@ -58,7 +58,7 @@ "prettier": "~3.4.0", "sass": "^1.66.0", "typescript": "~5.7.0", - "vite": "~6.0.0", + "vite": "~6.1.0", "vite-plugin-node-polyfills": "^0.23.0", "vue-tsc": "~2.2.0" } diff --git a/src/App.vue b/src/App.vue index 79ae90c..e3158c4 100644 --- a/src/App.vue +++ b/src/App.vue @@ -2,7 +2,7 @@ import { onBeforeMount, onMounted } from "vue"; import { useCookies } from "vue3-cookies"; import { useRoute, useRouter } from "vue-router"; -import { client } from "@/client/sdk.gen.ts"; +import { client } from "@/client/client.gen.ts"; import { environment } from "@/environment"; import AppHeader from "@/components/AppHeader.vue"; import AppFooter from "@/components/AppFooter.vue"; @@ -37,6 +37,7 @@ const newsStore = useNewsStore(); onBeforeMount(() => { client.setConfig({ + throwOnError: true, baseURL: environment.API_BASE_URL, paramsSerializer: (params) => param_stringify(params, { arrayFormat: "repeat" }), diff --git a/src/client/client.gen.ts b/src/client/client.gen.ts new file mode 100644 index 0000000..a246d32 --- /dev/null +++ b/src/client/client.gen.ts @@ -0,0 +1,28 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { ClientOptions } from "./types.gen"; +import { + type Config, + type ClientOptions as DefaultClientOptions, + createClient, + createConfig, +} from "@hey-api/client-axios"; + +/** + * The `createClientConfig()` function will be called on client initialization + * and the returned object will become the client's initial configuration. + * + * You may want to initialize your client this way instead of calling + * `setConfig()`. This is useful for example if you're using Next.js + * to ensure your client always has the correct values. + */ +export type CreateClientConfig<T extends DefaultClientOptions = ClientOptions> = + ( + override?: Config<DefaultClientOptions & T>, + ) => Config<Required<DefaultClientOptions> & T>; + +export const client = createClient( + createConfig<ClientOptions>({ + throwOnError: true, + }), +); diff --git a/src/client/index.ts b/src/client/index.ts index eae885d..da87079 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -1,3 +1,3 @@ // This file is auto-generated by @hey-api/openapi-ts -export * from "./sdk.gen"; export * from "./types.gen"; +export * from "./sdk.gen"; diff --git a/src/client/sdk.gen.ts b/src/client/sdk.gen.ts index edb2d35..cde07fd 100644 --- a/src/client/sdk.gen.ts +++ b/src/client/sdk.gen.ts @@ -1,1579 +1,1689 @@ // This file is auto-generated by @hey-api/openapi-ts import { - createClient, - createConfig, - type OptionsLegacyParser, + type Options as ClientOptions, + type TDataShape, + type Client, formDataBodySerializer, } from "@hey-api/client-axios"; -import { - type ApiTokenListTokenData, - type ApiTokenListTokenError, - type ApiTokenListTokenResponse, - type ApiTokenCreateTokenData, - type ApiTokenCreateTokenError, - type ApiTokenCreateTokenResponse, - type ApiTokenGetTokenData, - type ApiTokenGetTokenError, - type ApiTokenGetTokenResponse, - type ApiTokenDeleteTokenData, - type ApiTokenDeleteTokenError, - type ApiTokenDeleteTokenResponse, - type BucketListBucketsData, - type BucketListBucketsError, - type BucketListBucketsResponse, - type BucketCreateBucketData, - type BucketCreateBucketError, - type BucketCreateBucketResponse, - type BucketListBucketOtrsData, - type BucketListBucketOtrsError, - type BucketListBucketOtrsResponse, - type BucketGetBucketData, - type BucketGetBucketError, - type BucketGetBucketResponse, - type BucketDeleteBucketData, - type BucketDeleteBucketError, - type BucketDeleteBucketResponse, - type BucketGetBucketOtrData, - type BucketGetBucketOtrError, - type BucketGetBucketOtrResponse, - type BucketCreateBucketOtrData, - type BucketCreateBucketOtrError, - type BucketCreateBucketOtrResponse, - type BucketAcceptBucketOtrData, - type BucketAcceptBucketOtrError, - type BucketAcceptBucketOtrResponse, - type BucketDeleteBucketOtrData, - type BucketDeleteBucketOtrError, - type BucketDeleteBucketOtrResponse, - type BucketUpdateBucketPublicStateData, - type BucketUpdateBucketPublicStateError, - type BucketUpdateBucketPublicStateResponse, - type BucketUpdateBucketLimitsData, - type BucketUpdateBucketLimitsError, - type BucketUpdateBucketLimitsResponse, - type BucketPermissionListPermissionsData, - type BucketPermissionListPermissionsError, - type BucketPermissionListPermissionsResponse, - type BucketPermissionCreatePermissionData, - type BucketPermissionCreatePermissionError, - type BucketPermissionCreatePermissionResponse, - type BucketPermissionListPermissionsPerUserData, - type BucketPermissionListPermissionsPerUserError, - type BucketPermissionListPermissionsPerUserResponse, - type BucketPermissionListPermissionsPerBucketData, - type BucketPermissionListPermissionsPerBucketError, - type BucketPermissionListPermissionsPerBucketResponse, - type BucketPermissionGetPermissionData, - type BucketPermissionGetPermissionError, - type BucketPermissionGetPermissionResponse, - type BucketPermissionUpdatePermissionData, - type BucketPermissionUpdatePermissionError, - type BucketPermissionUpdatePermissionResponse, - type BucketPermissionDeletePermissionData, - type BucketPermissionDeletePermissionError, - type BucketPermissionDeletePermissionResponse, - type NewsCreateNewsData, - type NewsCreateNewsError, - type NewsCreateNewsResponse, - type NewsListNewsData, - type NewsListNewsError, - type NewsListNewsResponse, - type NewsListLatestNewsError, - type NewsListLatestNewsResponse, - type NewsGetNewsData, - type NewsGetNewsError, - type NewsGetNewsResponse, - type NewsDeleteNewsData, - type NewsDeleteNewsError, - type NewsDeleteNewsResponse, - type PublicGetPublicWorkflowsError, - type PublicGetPublicWorkflowsResponse, - type ResourceCreateResourceData, - type ResourceCreateResourceError, - type ResourceCreateResourceResponse, - type ResourceListResourcesData, - type ResourceListResourcesError, - type ResourceListResourcesResponse, - type ResourceListSyncRequestsError, - type ResourceListSyncRequestsResponse, - type ResourceListResourceOtrsData, - type ResourceListResourceOtrsError, - type ResourceListResourceOtrsResponse, - type ResourceGetResourceData, - type ResourceGetResourceError, - type ResourceGetResourceResponse, - type ResourceDeleteResourceData, - type ResourceDeleteResourceError, - type ResourceDeleteResourceResponse, - type ResourceGetResourceOtrData, - type ResourceGetResourceOtrError, - type ResourceGetResourceOtrResponse, - type ResourceCreateResourceOtrData, - type ResourceCreateResourceOtrError, - type ResourceCreateResourceOtrResponse, - type ResourceAcceptResourceOtrData, - type ResourceAcceptResourceOtrError, - type ResourceAcceptResourceOtrResponse, - type ResourceDeleteResourceOtrData, - type ResourceDeleteResourceOtrError, - type ResourceDeleteResourceOtrResponse, - type ResourceVersionListResourceVersionsData, - type ResourceVersionListResourceVersionsError, - type ResourceVersionListResourceVersionsResponse, - type ResourceVersionRequestResourceVersionData, - type ResourceVersionRequestResourceVersionError, - type ResourceVersionRequestResourceVersionResponse, - type ResourceVersionGetResourceVersionData, - type ResourceVersionGetResourceVersionError, - type ResourceVersionGetResourceVersionResponse, - type ResourceVersionResourceFileTreeData, - type ResourceVersionResourceFileTreeError, - type ResourceVersionResourceFileTreeResponse, - type ResourceVersionRequestResourceVersionReviewData, - type ResourceVersionRequestResourceVersionReviewError, - type ResourceVersionRequestResourceVersionReviewResponse, - type ResourceVersionRequestResourceVersionSyncData, - type ResourceVersionRequestResourceVersionSyncError, - type ResourceVersionRequestResourceVersionSyncResponse, - type ResourceVersionResourceVersionReviewData, - type ResourceVersionResourceVersionReviewError, - type ResourceVersionResourceVersionReviewResponse, - type ResourceVersionResourceVersionSyncData, - type ResourceVersionResourceVersionSyncError, - type ResourceVersionResourceVersionSyncResponse, - type ResourceVersionResourceVersionLatestData, - type ResourceVersionResourceVersionLatestError, - type ResourceVersionResourceVersionLatestResponse, - type ResourceVersionDeleteResourceVersionClusterData, - type ResourceVersionDeleteResourceVersionClusterError, - type ResourceVersionDeleteResourceVersionClusterResponse, - type ResourceVersionDeleteResourceVersionS3Data, - type ResourceVersionDeleteResourceVersionS3Error, - type ResourceVersionDeleteResourceVersionS3Response, - type S3KeyGetUserKeysData, - type S3KeyGetUserKeysError, - type S3KeyGetUserKeysResponse, - type S3KeyCreateUserKeyData, - type S3KeyCreateUserKeyError, - type S3KeyCreateUserKeyResponse, - type S3KeyGetUserKeyData, - type S3KeyGetUserKeyError, - type S3KeyGetUserKeyResponse, - type S3KeyDeleteUserKeyData, - type S3KeyDeleteUserKeyError, - type S3KeyDeleteUserKeyResponse, - type UserCreateUserData, - type UserCreateUserError, - type UserCreateUserResponse, - type UserListUsersData, - type UserListUsersError, - type UserListUsersResponse, - type UserSearchUsersData, - type UserSearchUsersError, - type UserSearchUsersResponse, - type UserGetLoggedInUserError, - type UserGetLoggedInUserResponse, - type UserGetUserData, - type UserGetUserError, - type UserGetUserResponse, - type UserUpdateRolesData, - type UserUpdateRolesError, - type UserUpdateRolesResponse, - type UserResendInvitationData, - type UserResendInvitationError, - type UserResendInvitationResponse, - type WorkflowCreateWorkflowData, - type WorkflowCreateWorkflowError, - type WorkflowCreateWorkflowResponse, - type WorkflowListWorkflowsData, - type WorkflowListWorkflowsError, - type WorkflowListWorkflowsResponse, - type WorkflowListWorkflowOtrsData, - type WorkflowListWorkflowOtrsError, - type WorkflowListWorkflowOtrsResponse, - type WorkflowGetDeveloperWorkflowStatisticsData, - type WorkflowGetDeveloperWorkflowStatisticsError, - type WorkflowGetDeveloperWorkflowStatisticsResponse, - type WorkflowGetWorkflowData, - type WorkflowGetWorkflowError, - type WorkflowGetWorkflowResponse, - type WorkflowDeleteWorkflowData, - type WorkflowDeleteWorkflowError, - type WorkflowDeleteWorkflowResponse, - type WorkflowGetWorkflowOtrData, - type WorkflowGetWorkflowOtrError, - type WorkflowGetWorkflowOtrResponse, - type WorkflowCreateWorkflowOtrData, - type WorkflowCreateWorkflowOtrError, - type WorkflowCreateWorkflowOtrResponse, - type WorkflowAcceptWorkflowOtrData, - type WorkflowAcceptWorkflowOtrError, - type WorkflowAcceptWorkflowOtrResponse, - type WorkflowDeleteWorkflowOtrData, - type WorkflowDeleteWorkflowOtrError, - type WorkflowDeleteWorkflowOtrResponse, - type WorkflowGetWorkflowStatisticsData, - type WorkflowGetWorkflowStatisticsError, - type WorkflowGetWorkflowStatisticsResponse, - type WorkflowUpdateWorkflowData, - type WorkflowUpdateWorkflowError, - type WorkflowUpdateWorkflowResponse, - WorkflowGetDeveloperWorkflowStatisticsResponseTransformer, - WorkflowGetWorkflowStatisticsResponseTransformer, - type WorkflowCredentialsGetWorkflowCredentialsData, - type WorkflowCredentialsGetWorkflowCredentialsError, - type WorkflowCredentialsGetWorkflowCredentialsResponse, - type WorkflowCredentialsUpdateWorkflowCredentialsData, - type WorkflowCredentialsUpdateWorkflowCredentialsError, - type WorkflowCredentialsUpdateWorkflowCredentialsResponse, - type WorkflowCredentialsDeleteWorkflowCredentialsData, - type WorkflowCredentialsDeleteWorkflowCredentialsError, - type WorkflowCredentialsDeleteWorkflowCredentialsResponse, - type WorkflowExecutionStartWorkflowData, - type WorkflowExecutionStartWorkflowError, - type WorkflowExecutionStartWorkflowResponse, - type WorkflowExecutionListWorkflowExecutionsData, - type WorkflowExecutionListWorkflowExecutionsError, - type WorkflowExecutionListWorkflowExecutionsResponse, - type WorkflowExecutionStartArbitraryWorkflowData, - type WorkflowExecutionStartArbitraryWorkflowError, - type WorkflowExecutionStartArbitraryWorkflowResponse, - type WorkflowExecutionGetWorkflowExecutionData, - type WorkflowExecutionGetWorkflowExecutionError, - type WorkflowExecutionGetWorkflowExecutionResponse, - type WorkflowExecutionDeleteWorkflowExecutionData, - type WorkflowExecutionDeleteWorkflowExecutionError, - type WorkflowExecutionDeleteWorkflowExecutionResponse, - type WorkflowExecutionGetWorkflowExecutionParamsData, - type WorkflowExecutionGetWorkflowExecutionParamsError, - type WorkflowExecutionGetWorkflowExecutionParamsResponse, - type WorkflowExecutionCancelWorkflowExecutionData, - type WorkflowExecutionCancelWorkflowExecutionError, - type WorkflowExecutionCancelWorkflowExecutionResponse, - type WorkflowModeGetWorkflowModeData, - type WorkflowModeGetWorkflowModeError, - type WorkflowModeGetWorkflowModeResponse, - type WorkflowVersionListWorkflowVersionData, - type WorkflowVersionListWorkflowVersionError, - type WorkflowVersionListWorkflowVersionResponse, - type WorkflowVersionGetWorkflowVersionData, - type WorkflowVersionGetWorkflowVersionError, - type WorkflowVersionGetWorkflowVersionResponse, - type WorkflowVersionUpdateWorkflowVersionStatusData, - type WorkflowVersionUpdateWorkflowVersionStatusError, - type WorkflowVersionUpdateWorkflowVersionStatusResponse, - type WorkflowVersionGetWorkflowVersionMetadataData, - type WorkflowVersionGetWorkflowVersionMetadataError, - type WorkflowVersionGetWorkflowVersionMetadataResponse, - type WorkflowVersionUpdateWorkflowVersionMetadataData, - type WorkflowVersionUpdateWorkflowVersionMetadataError, - type WorkflowVersionUpdateWorkflowVersionMetadataResponse, - type WorkflowVersionDeprecateWorkflowVersionData, - type WorkflowVersionDeprecateWorkflowVersionError, - type WorkflowVersionDeprecateWorkflowVersionResponse, - type WorkflowVersionUpdateWorkflowVersionParameterExtensionData, - type WorkflowVersionUpdateWorkflowVersionParameterExtensionError, - type WorkflowVersionUpdateWorkflowVersionParameterExtensionResponse, - type WorkflowVersionDownloadWorkflowDocumentationData, - type WorkflowVersionDownloadWorkflowDocumentationError, - type WorkflowVersionDownloadWorkflowDocumentationResponse, - type WorkflowVersionUploadWorkflowVersionIconData, - type WorkflowVersionUploadWorkflowVersionIconError, - type WorkflowVersionUploadWorkflowVersionIconResponse, - type WorkflowVersionDeleteWorkflowVersionIconData, - type WorkflowVersionDeleteWorkflowVersionIconError, - type WorkflowVersionDeleteWorkflowVersionIconResponse, +import type { + AuthKickstartLoginData, + AuthKickstartLoginError, + AuthLoginCallbackData, + AuthLoginCallbackError, + AuthKickstartAccountConnectionData, + AuthKickstartAccountConnectionError, + AuthAccountConnectionCallbackData, + AuthAccountConnectionCallbackError, + AuthLogoutData, + ApiTokenListTokenData, + ApiTokenListTokenResponse, + ApiTokenListTokenError, + ApiTokenCreateTokenData, + ApiTokenCreateTokenResponse, + ApiTokenCreateTokenError, + ApiTokenDeleteTokenData, + ApiTokenDeleteTokenResponse, + ApiTokenDeleteTokenError, + ApiTokenGetTokenData, + ApiTokenGetTokenResponse, + ApiTokenGetTokenError, + UserListUsersData, + UserListUsersResponse, + UserListUsersError, + UserCreateUserData, + UserCreateUserResponse, + UserCreateUserError, + UserSearchUsersData, + UserSearchUsersResponse, + UserSearchUsersError, + UserGetLoggedInUserData, + UserGetLoggedInUserResponse, + UserDeleteUserData, + UserDeleteUserResponse, + UserDeleteUserError, + UserGetUserData, + UserGetUserResponse, + UserGetUserError, + UserUpdateRolesData, + UserUpdateRolesResponse, + UserUpdateRolesError, + UserResendInvitationData, + UserResendInvitationResponse, + UserResendInvitationError, + S3KeyGetUserKeysData, + S3KeyGetUserKeysResponse, + S3KeyGetUserKeysError, + S3KeyCreateUserKeyData, + S3KeyCreateUserKeyResponse, + S3KeyCreateUserKeyError, + S3KeyDeleteUserKeyData, + S3KeyDeleteUserKeyResponse, + S3KeyDeleteUserKeyError, + S3KeyGetUserKeyData, + S3KeyGetUserKeyResponse, + S3KeyGetUserKeyError, + BucketListBucketsData, + BucketListBucketsResponse, + BucketListBucketsError, + BucketCreateBucketData, + BucketCreateBucketResponse, + BucketCreateBucketError, + BucketListBucketOtrsData, + BucketListBucketOtrsResponse, + BucketListBucketOtrsError, + BucketDeleteBucketData, + BucketDeleteBucketResponse, + BucketDeleteBucketError, + BucketGetBucketData, + BucketGetBucketResponse, + BucketGetBucketError, + BucketDeleteBucketOtrData, + BucketDeleteBucketOtrResponse, + BucketDeleteBucketOtrError, + BucketGetBucketOtrData, + BucketGetBucketOtrResponse, + BucketGetBucketOtrError, + BucketAcceptBucketOtrData, + BucketAcceptBucketOtrResponse, + BucketAcceptBucketOtrError, + BucketCreateBucketOtrData, + BucketCreateBucketOtrResponse, + BucketCreateBucketOtrError, + BucketUpdateBucketPublicStateData, + BucketUpdateBucketPublicStateResponse, + BucketUpdateBucketPublicStateError, + BucketUpdateBucketLimitsData, + BucketUpdateBucketLimitsResponse, + BucketUpdateBucketLimitsError, + BucketPermissionListPermissionsData, + BucketPermissionListPermissionsResponse, + BucketPermissionListPermissionsError, + BucketPermissionCreatePermissionData, + BucketPermissionCreatePermissionResponse, + BucketPermissionCreatePermissionError, + BucketPermissionListPermissionsPerUserData, + BucketPermissionListPermissionsPerUserResponse, + BucketPermissionListPermissionsPerUserError, + BucketPermissionListPermissionsPerBucketData, + BucketPermissionListPermissionsPerBucketResponse, + BucketPermissionListPermissionsPerBucketError, + BucketPermissionDeletePermissionData, + BucketPermissionDeletePermissionResponse, + BucketPermissionDeletePermissionError, + BucketPermissionGetPermissionData, + BucketPermissionGetPermissionResponse, + BucketPermissionGetPermissionError, + BucketPermissionUpdatePermissionData, + BucketPermissionUpdatePermissionResponse, + BucketPermissionUpdatePermissionError, + WorkflowListWorkflowsData, + WorkflowListWorkflowsResponse, + WorkflowListWorkflowsError, + WorkflowCreateWorkflowData, + WorkflowCreateWorkflowResponse, + WorkflowCreateWorkflowError, + WorkflowListWorkflowOtrsData, + WorkflowListWorkflowOtrsResponse, + WorkflowListWorkflowOtrsError, + WorkflowGetDeveloperWorkflowStatisticsData, + WorkflowGetDeveloperWorkflowStatisticsResponse, + WorkflowGetDeveloperWorkflowStatisticsError, + WorkflowDeleteWorkflowData, + WorkflowDeleteWorkflowResponse, + WorkflowDeleteWorkflowError, + WorkflowGetWorkflowData, + WorkflowGetWorkflowResponse, + WorkflowGetWorkflowError, + WorkflowDeleteWorkflowOtrData, + WorkflowDeleteWorkflowOtrResponse, + WorkflowDeleteWorkflowOtrError, + WorkflowGetWorkflowOtrData, + WorkflowGetWorkflowOtrResponse, + WorkflowGetWorkflowOtrError, + WorkflowAcceptWorkflowOtrData, + WorkflowAcceptWorkflowOtrResponse, + WorkflowAcceptWorkflowOtrError, + WorkflowCreateWorkflowOtrData, + WorkflowCreateWorkflowOtrResponse, + WorkflowCreateWorkflowOtrError, + WorkflowGetWorkflowStatisticsData, + WorkflowGetWorkflowStatisticsResponse, + WorkflowGetWorkflowStatisticsError, + WorkflowUpdateWorkflowData, + WorkflowUpdateWorkflowResponse, + WorkflowUpdateWorkflowError, + WorkflowVersionListWorkflowVersionData, + WorkflowVersionListWorkflowVersionResponse, + WorkflowVersionListWorkflowVersionError, + WorkflowVersionGetWorkflowVersionData, + WorkflowVersionGetWorkflowVersionResponse, + WorkflowVersionGetWorkflowVersionError, + WorkflowVersionUpdateWorkflowVersionStatusData, + WorkflowVersionUpdateWorkflowVersionStatusResponse, + WorkflowVersionUpdateWorkflowVersionStatusError, + WorkflowVersionGetWorkflowVersionMetadataData, + WorkflowVersionGetWorkflowVersionMetadataResponse, + WorkflowVersionGetWorkflowVersionMetadataError, + WorkflowVersionUpdateWorkflowVersionMetadataData, + WorkflowVersionUpdateWorkflowVersionMetadataResponse, + WorkflowVersionUpdateWorkflowVersionMetadataError, + WorkflowVersionDeprecateWorkflowVersionData, + WorkflowVersionDeprecateWorkflowVersionResponse, + WorkflowVersionDeprecateWorkflowVersionError, + WorkflowVersionUpdateWorkflowVersionParameterExtensionData, + WorkflowVersionUpdateWorkflowVersionParameterExtensionResponse, + WorkflowVersionUpdateWorkflowVersionParameterExtensionError, + WorkflowVersionDownloadWorkflowDocumentationData, + WorkflowVersionDownloadWorkflowDocumentationError, + WorkflowVersionDeleteWorkflowVersionIconData, + WorkflowVersionDeleteWorkflowVersionIconResponse, + WorkflowVersionDeleteWorkflowVersionIconError, + WorkflowVersionUploadWorkflowVersionIconData, + WorkflowVersionUploadWorkflowVersionIconResponse, + WorkflowVersionUploadWorkflowVersionIconError, + WorkflowExecutionListWorkflowExecutionsData, + WorkflowExecutionListWorkflowExecutionsResponse, + WorkflowExecutionListWorkflowExecutionsError, + WorkflowExecutionStartWorkflowData, + WorkflowExecutionStartWorkflowResponse, + WorkflowExecutionStartWorkflowError, + WorkflowExecutionStartArbitraryWorkflowData, + WorkflowExecutionStartArbitraryWorkflowResponse, + WorkflowExecutionStartArbitraryWorkflowError, + WorkflowExecutionDeleteWorkflowExecutionData, + WorkflowExecutionDeleteWorkflowExecutionResponse, + WorkflowExecutionDeleteWorkflowExecutionError, + WorkflowExecutionGetWorkflowExecutionData, + WorkflowExecutionGetWorkflowExecutionResponse, + WorkflowExecutionGetWorkflowExecutionError, + WorkflowExecutionGetWorkflowExecutionParamsData, + WorkflowExecutionGetWorkflowExecutionParamsResponse, + WorkflowExecutionGetWorkflowExecutionParamsError, + WorkflowExecutionCancelWorkflowExecutionData, + WorkflowExecutionCancelWorkflowExecutionResponse, + WorkflowExecutionCancelWorkflowExecutionError, + WorkflowCredentialsDeleteWorkflowCredentialsData, + WorkflowCredentialsDeleteWorkflowCredentialsResponse, + WorkflowCredentialsDeleteWorkflowCredentialsError, + WorkflowCredentialsGetWorkflowCredentialsData, + WorkflowCredentialsGetWorkflowCredentialsResponse, + WorkflowCredentialsGetWorkflowCredentialsError, + WorkflowCredentialsUpdateWorkflowCredentialsData, + WorkflowCredentialsUpdateWorkflowCredentialsError, + WorkflowModeGetWorkflowModeData, + WorkflowModeGetWorkflowModeResponse, + WorkflowModeGetWorkflowModeError, + ResourceListResourcesData, + ResourceListResourcesResponse, + ResourceListResourcesError, + ResourceCreateResourceData, + ResourceCreateResourceResponse, + ResourceCreateResourceError, + ResourceListSyncRequestsData, + ResourceListSyncRequestsResponse, + ResourceListResourceOtrsData, + ResourceListResourceOtrsResponse, + ResourceListResourceOtrsError, + ResourceDeleteResourceData, + ResourceDeleteResourceResponse, + ResourceDeleteResourceError, + ResourceGetResourceData, + ResourceGetResourceResponse, + ResourceGetResourceError, + ResourceDeleteResourceOtrData, + ResourceDeleteResourceOtrResponse, + ResourceDeleteResourceOtrError, + ResourceGetResourceOtrData, + ResourceGetResourceOtrResponse, + ResourceGetResourceOtrError, + ResourceAcceptResourceOtrData, + ResourceAcceptResourceOtrResponse, + ResourceAcceptResourceOtrError, + ResourceCreateResourceOtrData, + ResourceCreateResourceOtrResponse, + ResourceCreateResourceOtrError, + ResourceVersionListResourceVersionsData, + ResourceVersionListResourceVersionsResponse, + ResourceVersionListResourceVersionsError, + ResourceVersionRequestResourceVersionData, + ResourceVersionRequestResourceVersionResponse, + ResourceVersionRequestResourceVersionError, + ResourceVersionGetResourceVersionData, + ResourceVersionGetResourceVersionResponse, + ResourceVersionGetResourceVersionError, + ResourceVersionResourceFileTreeData, + ResourceVersionResourceFileTreeResponse, + ResourceVersionResourceFileTreeError, + ResourceVersionRequestResourceVersionReviewData, + ResourceVersionRequestResourceVersionReviewResponse, + ResourceVersionRequestResourceVersionReviewError, + ResourceVersionRequestResourceVersionSyncData, + ResourceVersionRequestResourceVersionSyncResponse, + ResourceVersionRequestResourceVersionSyncError, + ResourceVersionResourceVersionReviewData, + ResourceVersionResourceVersionReviewResponse, + ResourceVersionResourceVersionReviewError, + ResourceVersionResourceVersionSyncData, + ResourceVersionResourceVersionSyncResponse, + ResourceVersionResourceVersionSyncError, + ResourceVersionResourceVersionLatestData, + ResourceVersionResourceVersionLatestResponse, + ResourceVersionResourceVersionLatestError, + ResourceVersionDeleteResourceVersionClusterData, + ResourceVersionDeleteResourceVersionClusterResponse, + ResourceVersionDeleteResourceVersionClusterError, + ResourceVersionDeleteResourceVersionS3Data, + ResourceVersionDeleteResourceVersionS3Response, + ResourceVersionDeleteResourceVersionS3Error, + NewsListNewsData, + NewsListNewsResponse, + NewsListNewsError, + NewsCreateNewsData, + NewsCreateNewsResponse, + NewsCreateNewsError, + NewsListLatestNewsData, + NewsListLatestNewsResponse, + NewsDeleteNewsData, + NewsDeleteNewsResponse, + NewsDeleteNewsError, + NewsGetNewsData, + NewsGetNewsResponse, + NewsGetNewsError, + PublicGetPublicWorkflowsData, + PublicGetPublicWorkflowsResponse, } from "./types.gen"; +import { client as _heyApiClient } from "./client.gen"; +import { resourceVersionResourceFileTreeResponseTransformer } from "./transformers.gen"; -export const client = createClient( - createConfig({ - throwOnError: true, - }), -); +export type Options< + TData extends TDataShape = TDataShape, + ThrowOnError extends boolean = boolean, +> = ClientOptions<TData, ThrowOnError> & { + /** + * You can provide a client instance returned by `createClient()` instead of + * individual options. This might be also useful if you want to implement a + * custom client. + */ + client?: Client; +}; -export class ApiTokenService { +export class AuthService { /** - * List API token - * List meta information about all API token. - * - * Permissions `api_token:list_all` required. See parameter `uid` for exception. + * Kickstart the login flow + * Redirect route to OIDC provider to kickstart the login process. */ - public static apiTokenListToken<ThrowOnError extends boolean = true>( - options?: OptionsLegacyParser<ApiTokenListTokenData, ThrowOnError>, + public static authKickstartLogin<ThrowOnError extends boolean = true>( + options: Options<AuthKickstartLoginData, ThrowOnError>, ) { - return (options?.client ?? client).get< - ApiTokenListTokenResponse, - ApiTokenListTokenError, + return (options.client ?? _heyApiClient).get< + unknown, + AuthKickstartLoginError, ThrowOnError >({ + url: "/auth/login/{provider}", ...options, - url: "/ui/tokens", }); } /** - * Create new API token - * Create a new API token for the current user. + * LifeScience Login Callback + * Callback for the login process with an OIDC Provider. * - * Permission `api_token:create` required. + * Visit the route login route to start the login process. + * + * If the user is already known to the system, then a JWT token will be created and sent via the 'set-cookie' header. + * The key for this Cookie is 'bearer'. + * + * If the user is new, he will be created him and then a JWT token is issued. + * + * This JWT has to be sent to all authorized endpoints via the HTTPBearer scheme. */ - public static apiTokenCreateToken<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<ApiTokenCreateTokenData, ThrowOnError>, + public static authLoginCallback<ThrowOnError extends boolean = true>( + options: Options<AuthLoginCallbackData, ThrowOnError>, ) { - return (options?.client ?? client).post< - ApiTokenCreateTokenResponse, - ApiTokenCreateTokenError, + return (options.client ?? _heyApiClient).get< + unknown, + AuthLoginCallbackError, ThrowOnError >({ + url: "/auth/login/callback/{provider}", ...options, - url: "/ui/tokens", }); } /** - * Get API token - * Get an API token by id. - * - * Permission `api_token:read` required if the current user is the owner of the API token, - * otherwise `api_token:read_any` required. + * Kickstart the account connection flow + * Redirect route to OIDC provider to connect the CloWM account with the AAI account. */ - public static apiTokenGetToken<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<ApiTokenGetTokenData, ThrowOnError>, - ) { - return (options?.client ?? client).get< - ApiTokenGetTokenResponse, - ApiTokenGetTokenError, + public static authKickstartAccountConnection< + ThrowOnError extends boolean = true, + >(options: Options<AuthKickstartAccountConnectionData, ThrowOnError>) { + return (options.client ?? _heyApiClient).get< + unknown, + AuthKickstartAccountConnectionError, ThrowOnError >({ + url: "/auth/account/connect/{provider}", ...options, - url: "/ui/tokens/{tid}", }); } /** - * Delete API token - * Delete an API token by id. - * - * Permission `api_token:delete` required if the current user is the owner of the API token, - * otherwise `api_token:delete_any` required. + * LifeScience Login Callback + * Callback for the account connection process with an OIDC provider. */ - public static apiTokenDeleteToken<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<ApiTokenDeleteTokenData, ThrowOnError>, - ) { - return (options?.client ?? client).delete< - ApiTokenDeleteTokenResponse, - ApiTokenDeleteTokenError, + public static authAccountConnectionCallback< + ThrowOnError extends boolean = true, + >(options: Options<AuthAccountConnectionCallbackData, ThrowOnError>) { + return (options.client ?? _heyApiClient).get< + unknown, + AuthAccountConnectionCallbackError, ThrowOnError >({ + url: "/auth/account/callback/{provider}", ...options, - url: "/ui/tokens/{tid}", }); } -} -export class BucketService { /** - * List buckets - * List all the buckets in the system or of the desired user where the user has permissions for. - * - * Permission `bucket:list_all` required. See parameter `owner_id` for exception. + * Logout + * Logout the user from the system by deleting the bearer cookie. */ - public static bucketListBuckets<ThrowOnError extends boolean = true>( - options?: OptionsLegacyParser<BucketListBucketsData, ThrowOnError>, + public static authLogout<ThrowOnError extends boolean = true>( + options?: Options<AuthLogoutData, ThrowOnError>, ) { - return (options?.client ?? client).get< - BucketListBucketsResponse, - BucketListBucketsError, + return (options?.client ?? _heyApiClient).get< + unknown, + unknown, ThrowOnError >({ + url: "/auth/logout", ...options, - url: "/ui/buckets", }); } +} +export class ApiTokenService { /** - * Create a bucket for the current user - * Create a bucket for the current user. - * - * The name of the bucket has some constraints. - * For more information see the - * [Ceph documentation](https://docs.ceph.com/en/quincy/radosgw/s3/bucketops/#constraints) + * List API token + * List meta information about all API token. * - * Permission `bucket:create` required. + * Permissions `api_token:list_all` required. See parameter `uid` for exception. */ - public static bucketCreateBucket<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<BucketCreateBucketData, ThrowOnError>, + public static apiTokenListToken<ThrowOnError extends boolean = true>( + options?: Options<ApiTokenListTokenData, ThrowOnError>, ) { - return (options?.client ?? client).post< - BucketCreateBucketResponse, - BucketCreateBucketError, + return (options?.client ?? _heyApiClient).get< + ApiTokenListTokenResponse, + ApiTokenListTokenError, ThrowOnError >({ + url: "/ui/tokens", ...options, - url: "/ui/buckets", }); } /** - * List bucket OTRs - * Get the ownership transfer requests for buckets. + * Create new API token + * Create a new API token for the current user. * - * Permission `bucket:list` required if `current_owner_id` or `new_owner_id` is the current users id, - * otherwise `bucket:list_all` + * Permission `api_token:create` required. */ - public static bucketListBucketOtrs<ThrowOnError extends boolean = true>( - options?: OptionsLegacyParser<BucketListBucketOtrsData, ThrowOnError>, + public static apiTokenCreateToken<ThrowOnError extends boolean = true>( + options: Options<ApiTokenCreateTokenData, ThrowOnError>, ) { - return (options?.client ?? client).get< - BucketListBucketOtrsResponse, - BucketListBucketOtrsError, + return (options.client ?? _heyApiClient).post< + ApiTokenCreateTokenResponse, + ApiTokenCreateTokenError, ThrowOnError >({ + url: "/ui/tokens", ...options, - url: "/ui/buckets/ownership_transfer_request", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } /** - * Get a bucket by its name - * Get a bucket by its name if the current user has READ permissions for the bucket. + * Delete API token + * Delete an API token by id. * - * Permission `bucket:read` required if the current user is the owner of the bucket, - * otherwise `bucket:read_any` required. + * Permission `api_token:delete` required if the current user is the owner of the API token, + * otherwise `api_token:delete_any` required. */ - public static bucketGetBucket<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<BucketGetBucketData, ThrowOnError>, + public static apiTokenDeleteToken<ThrowOnError extends boolean = true>( + options: Options<ApiTokenDeleteTokenData, ThrowOnError>, ) { - return (options?.client ?? client).get< - BucketGetBucketResponse, - BucketGetBucketError, + return (options.client ?? _heyApiClient).delete< + ApiTokenDeleteTokenResponse, + ApiTokenDeleteTokenError, ThrowOnError >({ + url: "/ui/tokens/{tid}", ...options, - url: "/ui/buckets/{bucket_name}", }); } /** - * Delete a bucket - * Delete a bucket by its name. Only the owner of the bucket can delete the bucket. + * Get API token + * Get an API token by id. * - * Permission `bucket:delete` required if the current user is the owner of the bucket, - * otherwise `bucket:delete_any` required. + * Permission `api_token:read` required if the current user is the owner of the API token, + * otherwise `api_token:read_any` required. */ - public static bucketDeleteBucket<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<BucketDeleteBucketData, ThrowOnError>, + public static apiTokenGetToken<ThrowOnError extends boolean = true>( + options: Options<ApiTokenGetTokenData, ThrowOnError>, ) { - return (options?.client ?? client).delete< - BucketDeleteBucketResponse, - BucketDeleteBucketError, + return (options.client ?? _heyApiClient).get< + ApiTokenGetTokenResponse, + ApiTokenGetTokenError, ThrowOnError >({ + url: "/ui/tokens/{tid}", ...options, - url: "/ui/buckets/{bucket_name}", }); } +} +export class UserService { /** - * Get a bucket OTR - * Get a specific bucket ownership transfer request. + * List users and search by their name + * List all users in the system.. * - * Permission `bucket:read` required if the current user is the current or new owner of the bucket, - * otherwise `bucket:read_any` required. + * Permission `user:list` required. */ - public static bucketGetBucketOtr<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<BucketGetBucketOtrData, ThrowOnError>, + public static userListUsers<ThrowOnError extends boolean = true>( + options?: Options<UserListUsersData, ThrowOnError>, ) { - return (options?.client ?? client).get< - BucketGetBucketOtrResponse, - BucketGetBucketOtrError, + return (options?.client ?? _heyApiClient).get< + UserListUsersResponse, + UserListUsersError, ThrowOnError >({ + url: "/ui/users", ...options, - url: "/ui/buckets/{bucket_name}/ownership_transfer_request", }); } /** - * Create a bucket OTR - * Create a ownership transfer request for a specific bucket. + * Create User + * Create a new user in the system and notify him. * - * Permission `bucket:update` required if the current user is the current owner of the bucket, - * otherwise `bucket:update_any` required. + * Permission `user:create` required. */ - public static bucketCreateBucketOtr<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<BucketCreateBucketOtrData, ThrowOnError>, + public static userCreateUser<ThrowOnError extends boolean = true>( + options: Options<UserCreateUserData, ThrowOnError>, ) { - return (options?.client ?? client).post< - BucketCreateBucketOtrResponse, - BucketCreateBucketOtrError, + return (options.client ?? _heyApiClient).post< + UserCreateUserResponse, + UserCreateUserError, ThrowOnError >({ + url: "/ui/users", ...options, - url: "/ui/buckets/{bucket_name}/ownership_transfer_request", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } /** - * Accept a bucket OTR - * Accept an ownership transfer request for a specific workflow. + * Search Users + * Search for users in the system by their name. * - * Permission `bucket:update` required if the current user is the new owner of the workflow, - * otherwise `bucket:update_any` required. + * Permission `user: search` required. */ - public static bucketAcceptBucketOtr<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<BucketAcceptBucketOtrData, ThrowOnError>, + public static userSearchUsers<ThrowOnError extends boolean = true>( + options: Options<UserSearchUsersData, ThrowOnError>, ) { - return (options?.client ?? client).patch< - BucketAcceptBucketOtrResponse, - BucketAcceptBucketOtrError, + return (options.client ?? _heyApiClient).get< + UserSearchUsersResponse, + UserSearchUsersError, ThrowOnError >({ + url: "/ui/users/search", ...options, - url: "/ui/buckets/{bucket_name}/ownership_transfer_request", }); } /** - * Delete a bucket OTR - * Delete/Reject a bucket ownership transfer request. + * Get the logged in user + * Return the user associated with the used JWT. * - * Permission `bucket:update` required if the current user is the current or new owner of the bucket, - * otherwise `bucket:update_any` required. + * Permission `user:read` required. */ - public static bucketDeleteBucketOtr<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<BucketDeleteBucketOtrData, ThrowOnError>, + public static userGetLoggedInUser<ThrowOnError extends boolean = true>( + options?: Options<UserGetLoggedInUserData, ThrowOnError>, ) { - return (options?.client ?? client).delete< - BucketDeleteBucketOtrResponse, - BucketDeleteBucketOtrError, + return (options?.client ?? _heyApiClient).get< + UserGetLoggedInUserResponse, + unknown, ThrowOnError >({ + url: "/ui/users/me", ...options, - url: "/ui/buckets/{bucket_name}/ownership_transfer_request", }); } /** - * Update public status - * Update the buckets public state. + * Delete a user + * Delete a user and his S3 account. * - * Permission `bucket:update` required if the current user is the owner of the bucket, - * otherwise `bucket:update_any` required. + * Permission `user:delete` required if the current user is the target user. */ - public static bucketUpdateBucketPublicState< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - BucketUpdateBucketPublicStateData, - ThrowOnError - >, + public static userDeleteUser<ThrowOnError extends boolean = true>( + options: Options<UserDeleteUserData, ThrowOnError>, ) { - return (options?.client ?? client).patch< - BucketUpdateBucketPublicStateResponse, - BucketUpdateBucketPublicStateError, + return (options.client ?? _heyApiClient).delete< + UserDeleteUserResponse, + UserDeleteUserError, ThrowOnError >({ + url: "/ui/users/{uid}", ...options, - url: "/ui/buckets/{bucket_name}/public", }); } /** - * Update bucket limits - * Update the buckets size limits. + * Get a user by its uid + * Return the user with the specific uid. * - * Permission `bucket:update_any` required. + * Permission `user:read` required. */ - public static bucketUpdateBucketLimits<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<BucketUpdateBucketLimitsData, ThrowOnError>, + public static userGetUser<ThrowOnError extends boolean = true>( + options: Options<UserGetUserData, ThrowOnError>, ) { - return (options?.client ?? client).patch< - BucketUpdateBucketLimitsResponse, - BucketUpdateBucketLimitsError, + return (options.client ?? _heyApiClient).get< + UserGetUserResponse, + UserGetUserError, ThrowOnError >({ + url: "/ui/users/{uid}", ...options, - url: "/ui/buckets/{bucket_name}/limits", }); } -} -export class BucketPermissionService { /** - * Get all permissions. - * List all the bucket permissions in the system. + * Update user roles + * Update the roles of a user. * - * Permission `bucket_permission:list_all` required. + * Permission `user:update` required. */ - public static bucketPermissionListPermissions< - ThrowOnError extends boolean = true, - >( - options?: OptionsLegacyParser< - BucketPermissionListPermissionsData, - ThrowOnError - >, + public static userUpdateRoles<ThrowOnError extends boolean = true>( + options: Options<UserUpdateRolesData, ThrowOnError>, ) { - return (options?.client ?? client).get< - BucketPermissionListPermissionsResponse, - BucketPermissionListPermissionsError, + return (options.client ?? _heyApiClient).put< + UserUpdateRolesResponse, + UserUpdateRolesError, ThrowOnError >({ + url: "/ui/users/{uid}/roles", ...options, - url: "/ui/permissions", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } /** - * Create a permission. - * Create a permission for a bucket and user. + * Resend Invitation + * Resend the invitation link for an user that has an open invitation. * - * Permission `bucket_permission:create` required. + * Permission `user:create` required. */ - public static bucketPermissionCreatePermission< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - BucketPermissionCreatePermissionData, - ThrowOnError - >, + public static userResendInvitation<ThrowOnError extends boolean = true>( + options: Options<UserResendInvitationData, ThrowOnError>, ) { - return (options?.client ?? client).post< - BucketPermissionCreatePermissionResponse, - BucketPermissionCreatePermissionError, + return (options.client ?? _heyApiClient).patch< + UserResendInvitationResponse, + UserResendInvitationError, ThrowOnError >({ + url: "/ui/users/{uid}/invitation", ...options, - url: "/ui/permissions", }); } +} +export class S3KeyService { /** - * Get all permissions for a user. - * List all the bucket permissions for the given user. + * Get the S3 Access keys from a user + * Get all the S3 Access keys for a specific user. * - * Permission `bucket_permission:list` required if current user is the target the bucket permission, - * otherwise `bucket_permission:list_all` required. + * Permission `s3_key:list` required if the current user is the target, otherwise `s3_key:list_all` required. */ - public static bucketPermissionListPermissionsPerUser< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - BucketPermissionListPermissionsPerUserData, - ThrowOnError - >, + public static s3KeyGetUserKeys<ThrowOnError extends boolean = true>( + options: Options<S3KeyGetUserKeysData, ThrowOnError>, ) { - return (options?.client ?? client).get< - BucketPermissionListPermissionsPerUserResponse, - BucketPermissionListPermissionsPerUserError, + return (options.client ?? _heyApiClient).get< + S3KeyGetUserKeysResponse, + S3KeyGetUserKeysError, ThrowOnError >({ + url: "/ui/users/{uid}/keys", ...options, - url: "/ui/permissions/user/{uid}", }); } /** - * Get all permissions for a bucket. - * List all the bucket permissions for the given bucket. + * Create a Access key for a user + * Create a S3 Access key for a specific user. * - * Permission `bucket_permission:list` required if current user is owner of the bucket, - * otherwise `bucket_permission:list_all` required. + * Permission `s3_key:create` required if the current user is the target, otherwise `s3_key:create_any` required. */ - public static bucketPermissionListPermissionsPerBucket< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - BucketPermissionListPermissionsPerBucketData, - ThrowOnError - >, + public static s3KeyCreateUserKey<ThrowOnError extends boolean = true>( + options: Options<S3KeyCreateUserKeyData, ThrowOnError>, ) { - return (options?.client ?? client).get< - BucketPermissionListPermissionsPerBucketResponse, - BucketPermissionListPermissionsPerBucketError, + return (options.client ?? _heyApiClient).post< + S3KeyCreateUserKeyResponse, + S3KeyCreateUserKeyError, ThrowOnError >({ + url: "/ui/users/{uid}/keys", ...options, - url: "/ui/permissions/bucket/{bucket_name}", }); } /** - * Get permission for bucket and user combination. - * Get the bucket permissions for the specific combination of bucket and user. + * Delete a specific S3 Access key from a user + * Delete a specific S3 Access key for a specific user. * - * Permission `bucket_permission:read` required if current user is the target or owner of the bucket permission, - * otherwise `bucket_permission:read_any` required. + * Permission `s3_key:delete` required if the current user is the target, otherwise `s3_key:delete_any` required. */ - public static bucketPermissionGetPermission< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - BucketPermissionGetPermissionData, - ThrowOnError - >, + public static s3KeyDeleteUserKey<ThrowOnError extends boolean = true>( + options: Options<S3KeyDeleteUserKeyData, ThrowOnError>, ) { - return (options?.client ?? client).get< - BucketPermissionGetPermissionResponse, - BucketPermissionGetPermissionError, + return (options.client ?? _heyApiClient).delete< + S3KeyDeleteUserKeyResponse, + S3KeyDeleteUserKeyError, ThrowOnError >({ + url: "/ui/users/{uid}/keys/{access_id}", ...options, - url: "/ui/permissions/bucket/{bucket_name}/user/{uid}", }); } /** - * Update a bucket permission - * Update a permission for a bucket and user. + * Get a specific S3 Access key from a user + * Get a specific S3 Access Key for a specific user. * - * Permission `bucket_permission:update` required. + * Permission `s3_key:read` required if the current user is the target, otherwise `s3_key:read_any` required. */ - public static bucketPermissionUpdatePermission< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - BucketPermissionUpdatePermissionData, - ThrowOnError - >, + public static s3KeyGetUserKey<ThrowOnError extends boolean = true>( + options: Options<S3KeyGetUserKeyData, ThrowOnError>, ) { - return (options?.client ?? client).put< - BucketPermissionUpdatePermissionResponse, - BucketPermissionUpdatePermissionError, + return (options.client ?? _heyApiClient).get< + S3KeyGetUserKeyResponse, + S3KeyGetUserKeyError, ThrowOnError >({ + url: "/ui/users/{uid}/keys/{access_id}", ...options, - url: "/ui/permissions/bucket/{bucket_name}/user/{uid}", }); } +} +export class BucketService { /** - * Delete a bucket permission - * Delete the bucket permissions for the specific combination of bucket and user. + * List buckets + * List all the buckets in the system or of the desired user where the user has permissions for. * - * Permission `bucket_permission:delete` required if current user is the target or owner of the bucket permission, - * otherwise `bucket_permission:delete_any` required. + * Permission `bucket:list_all` required. See parameter `owner_id` for exception. */ - public static bucketPermissionDeletePermission< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - BucketPermissionDeletePermissionData, - ThrowOnError - >, + public static bucketListBuckets<ThrowOnError extends boolean = true>( + options?: Options<BucketListBucketsData, ThrowOnError>, ) { - return (options?.client ?? client).delete< - BucketPermissionDeletePermissionResponse, - BucketPermissionDeletePermissionError, + return (options?.client ?? _heyApiClient).get< + BucketListBucketsResponse, + BucketListBucketsError, ThrowOnError >({ + url: "/ui/buckets", ...options, - url: "/ui/permissions/bucket/{bucket_name}/user/{uid}", }); } -} -export class NewsService { /** - * Create news - * Create a news event. + * Create a bucket for the current user + * Create a bucket for the current user. * - * Permission `news:create` required. + * The name of the bucket has some constraints. + * For more information see the + * [Ceph documentation](https://docs.ceph.com/en/quincy/radosgw/s3/bucketops/#constraints) + * + * Permission `bucket:create` required. */ - public static newsCreateNews<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<NewsCreateNewsData, ThrowOnError>, + public static bucketCreateBucket<ThrowOnError extends boolean = true>( + options: Options<BucketCreateBucketData, ThrowOnError>, ) { - return (options?.client ?? client).post< - NewsCreateNewsResponse, - NewsCreateNewsError, + return (options.client ?? _heyApiClient).post< + BucketCreateBucketResponse, + BucketCreateBucketError, ThrowOnError >({ + url: "/ui/buckets", ...options, - url: "/ui/news", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } /** - * List news - * List all news events with filters. - * - * This endpoint enforces keyset pagination. To iterate over all news, follow the link provided in the `Link` header. - * A missing `Link` header indicates that you iterated over all news with the current filters. + * List bucket OTRs + * Get the ownership transfer requests for buckets. * - * Permission `news:list` required. + * Permission `bucket:list` required if `current_owner_id` or `new_owner_id` is the current users id, + * otherwise `bucket:list_all` */ - public static newsListNews<ThrowOnError extends boolean = true>( - options?: OptionsLegacyParser<NewsListNewsData, ThrowOnError>, + public static bucketListBucketOtrs<ThrowOnError extends boolean = true>( + options?: Options<BucketListBucketOtrsData, ThrowOnError>, ) { - return (options?.client ?? client).get< - NewsListNewsResponse, - NewsListNewsError, + return (options?.client ?? _heyApiClient).get< + BucketListBucketOtrsResponse, + BucketListBucketOtrsError, ThrowOnError >({ + url: "/ui/buckets/ownership_transfer_request", ...options, - url: "/ui/news", }); } /** - * Get latest news - * List the current news events. + * Delete a bucket + * Delete a bucket by its name. Only the owner of the bucket can delete the bucket. * - * Permission `news:list` required. + * Permission `bucket:delete` required if the current user is the owner of the bucket, + * otherwise `bucket:delete_any` required. */ - public static newsListLatestNews<ThrowOnError extends boolean = true>( - options?: OptionsLegacyParser<unknown, ThrowOnError>, + public static bucketDeleteBucket<ThrowOnError extends boolean = true>( + options: Options<BucketDeleteBucketData, ThrowOnError>, ) { - return (options?.client ?? client).get< - NewsListLatestNewsResponse, - NewsListLatestNewsError, + return (options.client ?? _heyApiClient).delete< + BucketDeleteBucketResponse, + BucketDeleteBucketError, ThrowOnError >({ + url: "/ui/buckets/{bucket_name}", ...options, - url: "/ui/news/latest", }); } /** - * Get a specific news - * Get a specified news event. + * Get a bucket by its name + * Get a bucket by its name if the current user has READ permissions for the bucket. * - * Permission `news:read` required. + * Permission `bucket:read` required if the current user is the owner of the bucket, + * otherwise `bucket:read_any` required. */ - public static newsGetNews<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<NewsGetNewsData, ThrowOnError>, + public static bucketGetBucket<ThrowOnError extends boolean = true>( + options: Options<BucketGetBucketData, ThrowOnError>, ) { - return (options?.client ?? client).get< - NewsGetNewsResponse, - NewsGetNewsError, + return (options.client ?? _heyApiClient).get< + BucketGetBucketResponse, + BucketGetBucketError, ThrowOnError >({ + url: "/ui/buckets/{bucket_name}", ...options, - url: "/ui/news/{nid}", }); } /** - * Delete a specific news - * Delete a specified news event. + * Delete a bucket OTR + * Delete/Reject a bucket ownership transfer request. * - * Permission `news:delete` required. + * Permission `bucket:update` required if the current user is the current or new owner of the bucket, + * otherwise `bucket:update_any` required. */ - public static newsDeleteNews<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<NewsDeleteNewsData, ThrowOnError>, + public static bucketDeleteBucketOtr<ThrowOnError extends boolean = true>( + options: Options<BucketDeleteBucketOtrData, ThrowOnError>, ) { - return (options?.client ?? client).delete< - NewsDeleteNewsResponse, - NewsDeleteNewsError, + return (options.client ?? _heyApiClient).delete< + BucketDeleteBucketOtrResponse, + BucketDeleteBucketOtrError, ThrowOnError >({ + url: "/ui/buckets/{bucket_name}/ownership_transfer_request", ...options, - url: "/ui/news/{nid}", }); } -} -export class PublicService { /** - * Get available workflows - * Public route to fetch all available workflows. + * Get a bucket OTR + * Get a specific bucket ownership transfer request. + * + * Permission `bucket:read` required if the current user is the current or new owner of the bucket, + * otherwise `bucket:read_any` required. */ - public static publicGetPublicWorkflows<ThrowOnError extends boolean = true>( - options?: OptionsLegacyParser<unknown, ThrowOnError>, + public static bucketGetBucketOtr<ThrowOnError extends boolean = true>( + options: Options<BucketGetBucketOtrData, ThrowOnError>, ) { - return (options?.client ?? client).get< - PublicGetPublicWorkflowsResponse, - PublicGetPublicWorkflowsError, + return (options.client ?? _heyApiClient).get< + BucketGetBucketOtrResponse, + BucketGetBucketOtrError, ThrowOnError >({ + url: "/ui/buckets/{bucket_name}/ownership_transfer_request", ...options, - url: "/ui/public/workflows", }); } -} -export class ResourceService { /** - * Request a new resource - * Request a new resources. + * Accept a bucket OTR + * Accept an ownership transfer request for a specific workflow. * - * Permission `resource:create` required. + * Permission `bucket:update` required if the current user is the new owner of the workflow, + * otherwise `bucket:update_any` required. */ - public static resourceCreateResource<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<ResourceCreateResourceData, ThrowOnError>, + public static bucketAcceptBucketOtr<ThrowOnError extends boolean = true>( + options: Options<BucketAcceptBucketOtrData, ThrowOnError>, ) { - return (options?.client ?? client).post< - ResourceCreateResourceResponse, - ResourceCreateResourceError, + return (options.client ?? _heyApiClient).patch< + BucketAcceptBucketOtrResponse, + BucketAcceptBucketOtrError, ThrowOnError >({ + url: "/ui/buckets/{bucket_name}/ownership_transfer_request", ...options, - url: "/ui/resources", }); } /** - * List resources - * List all resources. + * Create a bucket OTR + * Create a ownership transfer request for a specific bucket. * - * Permission `resource:list` required. + * Permission `bucket:update` required if the current user is the current owner of the bucket, + * otherwise `bucket:update_any` required. */ - public static resourceListResources<ThrowOnError extends boolean = true>( - options?: OptionsLegacyParser<ResourceListResourcesData, ThrowOnError>, + public static bucketCreateBucketOtr<ThrowOnError extends boolean = true>( + options: Options<BucketCreateBucketOtrData, ThrowOnError>, ) { - return (options?.client ?? client).get< - ResourceListResourcesResponse, - ResourceListResourcesError, + return (options.client ?? _heyApiClient).post< + BucketCreateBucketOtrResponse, + BucketCreateBucketOtrError, ThrowOnError >({ + url: "/ui/buckets/{bucket_name}/ownership_transfer_request", ...options, - url: "/ui/resources", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } /** - * List resource sync requests - * List all resource sync requests. + * Update public status + * Update the buckets public state. * - * Permission `resource:update_any` required. + * Permission `bucket:update` required if the current user is the owner of the bucket, + * otherwise `bucket:update_any` required. */ - public static resourceListSyncRequests<ThrowOnError extends boolean = true>( - options?: OptionsLegacyParser<unknown, ThrowOnError>, - ) { - return (options?.client ?? client).get< - ResourceListSyncRequestsResponse, - ResourceListSyncRequestsError, + public static bucketUpdateBucketPublicState< + ThrowOnError extends boolean = true, + >(options: Options<BucketUpdateBucketPublicStateData, ThrowOnError>) { + return (options.client ?? _heyApiClient).patch< + BucketUpdateBucketPublicStateResponse, + BucketUpdateBucketPublicStateError, ThrowOnError >({ + url: "/ui/buckets/{bucket_name}/public", ...options, - url: "/ui/resources/sync_requests", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } /** - * List resource OTRs - * Get the ownership transfer requests for resources. + * Update bucket limits + * Update the buckets size limits. * - * Permission `resource:list` required if `current_owner_id` or `new_owner_id` is the current users id, - * otherwise `resource:list_all` + * Permission `bucket:update_any` required. */ - public static resourceListResourceOtrs<ThrowOnError extends boolean = true>( - options?: OptionsLegacyParser<ResourceListResourceOtrsData, ThrowOnError>, + public static bucketUpdateBucketLimits<ThrowOnError extends boolean = true>( + options: Options<BucketUpdateBucketLimitsData, ThrowOnError>, ) { - return (options?.client ?? client).get< - ResourceListResourceOtrsResponse, - ResourceListResourceOtrsError, + return (options.client ?? _heyApiClient).patch< + BucketUpdateBucketLimitsResponse, + BucketUpdateBucketLimitsError, ThrowOnError >({ + url: "/ui/buckets/{bucket_name}/limits", ...options, - url: "/ui/resources/ownership_transfer_request", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } +} +export class BucketPermissionService { /** - * Get a resource - * Get a specific resource. + * Get all permissions. + * List all the bucket permissions in the system. * - * Permission `resource:read` required. + * Permission `bucket_permission:list_all` required. */ - public static resourceGetResource<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<ResourceGetResourceData, ThrowOnError>, - ) { - return (options?.client ?? client).get< - ResourceGetResourceResponse, - ResourceGetResourceError, + public static bucketPermissionListPermissions< + ThrowOnError extends boolean = true, + >(options?: Options<BucketPermissionListPermissionsData, ThrowOnError>) { + return (options?.client ?? _heyApiClient).get< + BucketPermissionListPermissionsResponse, + BucketPermissionListPermissionsError, ThrowOnError >({ + url: "/ui/permissions", ...options, - url: "/ui/resources/{rid}", }); } /** - * Delete a resource - * Delete a resources. + * Create a permission. + * Create a permission for a bucket and user. * - * Permission `resource:delete` required. + * Permission `bucket_permission:create` required. */ - public static resourceDeleteResource<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<ResourceDeleteResourceData, ThrowOnError>, - ) { - return (options?.client ?? client).delete< - ResourceDeleteResourceResponse, - ResourceDeleteResourceError, + public static bucketPermissionCreatePermission< + ThrowOnError extends boolean = true, + >(options: Options<BucketPermissionCreatePermissionData, ThrowOnError>) { + return (options.client ?? _heyApiClient).post< + BucketPermissionCreatePermissionResponse, + BucketPermissionCreatePermissionError, ThrowOnError >({ + url: "/ui/permissions", ...options, - url: "/ui/resources/{rid}", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } /** - * Get a resource OTR - * Get a specific resource ownership transfer request. + * Get all permissions for a user. + * List all the bucket permissions for the given user. * - * Permission `resource:read` required if the current user is the current or new owner of the resource, - * otherwise `resource:read_any` required. + * Permission `bucket_permission:list` required if current user is the target the bucket permission, + * otherwise `bucket_permission:list_all` required. */ - public static resourceGetResourceOtr<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<ResourceGetResourceOtrData, ThrowOnError>, + public static bucketPermissionListPermissionsPerUser< + ThrowOnError extends boolean = true, + >( + options: Options<BucketPermissionListPermissionsPerUserData, ThrowOnError>, ) { - return (options?.client ?? client).get< - ResourceGetResourceOtrResponse, - ResourceGetResourceOtrError, + return (options.client ?? _heyApiClient).get< + BucketPermissionListPermissionsPerUserResponse, + BucketPermissionListPermissionsPerUserError, ThrowOnError >({ + url: "/ui/permissions/user/{uid}", ...options, - url: "/ui/resources/{rid}/ownership_transfer_request", }); } /** - * Create a resource OTR - * Create a ownership transfer request for a specific resource. + * Get all permissions for a bucket. + * List all the bucket permissions for the given bucket. * - * Permission `resource:update` required if the current user is the current owner of the resource, - * otherwise `resource:update_any` required. + * Permission `bucket_permission:list` required if current user is owner of the bucket, + * otherwise `bucket_permission:list_all` required. */ - public static resourceCreateResourceOtr<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<ResourceCreateResourceOtrData, ThrowOnError>, + public static bucketPermissionListPermissionsPerBucket< + ThrowOnError extends boolean = true, + >( + options: Options< + BucketPermissionListPermissionsPerBucketData, + ThrowOnError + >, ) { - return (options?.client ?? client).post< - ResourceCreateResourceOtrResponse, - ResourceCreateResourceOtrError, + return (options.client ?? _heyApiClient).get< + BucketPermissionListPermissionsPerBucketResponse, + BucketPermissionListPermissionsPerBucketError, ThrowOnError >({ + url: "/ui/permissions/bucket/{bucket_name}", ...options, - url: "/ui/resources/{rid}/ownership_transfer_request", }); } /** - * Accept a resource OTR - * Accept an ownership transfer request for a specific resource. + * Delete a bucket permission + * Delete the bucket permissions for the specific combination of bucket and user. * - * Permission `resource:update` required if the current user is the new owner of the resource, - * otherwise `resource:update_any` required. + * Permission `bucket_permission:delete` required if current user is the target or owner of the bucket permission, + * otherwise `bucket_permission:delete_any` required. */ - public static resourceAcceptResourceOtr<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<ResourceAcceptResourceOtrData, ThrowOnError>, - ) { - return (options?.client ?? client).patch< - ResourceAcceptResourceOtrResponse, - ResourceAcceptResourceOtrError, + public static bucketPermissionDeletePermission< + ThrowOnError extends boolean = true, + >(options: Options<BucketPermissionDeletePermissionData, ThrowOnError>) { + return (options.client ?? _heyApiClient).delete< + BucketPermissionDeletePermissionResponse, + BucketPermissionDeletePermissionError, ThrowOnError >({ + url: "/ui/permissions/bucket/{bucket_name}/user/{uid}", ...options, - url: "/ui/resources/{rid}/ownership_transfer_request", }); } /** - * Delete a resource OTR - * Delete/Reject a resource ownership transfer request. + * Get permission for bucket and user combination. + * Get the bucket permissions for the specific combination of bucket and user. * - * Permission `resource:update` required if the current user is the current or new owner of the resource, - * otherwise `resource:update_any` required. + * Permission `bucket_permission:read` required if current user is the target or owner of the bucket permission, + * otherwise `bucket_permission:read_any` required. */ - public static resourceDeleteResourceOtr<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<ResourceDeleteResourceOtrData, ThrowOnError>, - ) { - return (options?.client ?? client).delete< - ResourceDeleteResourceOtrResponse, - ResourceDeleteResourceOtrError, + public static bucketPermissionGetPermission< + ThrowOnError extends boolean = true, + >(options: Options<BucketPermissionGetPermissionData, ThrowOnError>) { + return (options.client ?? _heyApiClient).get< + BucketPermissionGetPermissionResponse, + BucketPermissionGetPermissionError, ThrowOnError >({ + url: "/ui/permissions/bucket/{bucket_name}/user/{uid}", ...options, - url: "/ui/resources/{rid}/ownership_transfer_request", }); } -} -export class ResourceVersionService { /** - * List versions of a resource - * List all the resource version for a specific resource. + * Update a bucket permission + * Update a permission for a bucket and user. * - * Permission 'resource:read' required. + * Permission `bucket_permission:update` required. */ - public static resourceVersionListResourceVersions< + public static bucketPermissionUpdatePermission< ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - ResourceVersionListResourceVersionsData, - ThrowOnError - >, - ) { - return (options?.client ?? client).get< - ResourceVersionListResourceVersionsResponse, - ResourceVersionListResourceVersionsError, + >(options: Options<BucketPermissionUpdatePermissionData, ThrowOnError>) { + return (options.client ?? _heyApiClient).put< + BucketPermissionUpdatePermissionResponse, + BucketPermissionUpdatePermissionError, ThrowOnError >({ + url: "/ui/permissions/bucket/{bucket_name}/user/{uid}", ...options, - url: "/ui/resources/{rid}/versions", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } +} +export class WorkflowService { /** - * Request new version of a resource - * Request a new resource version. + * List workflows + * List all workflows. * - * Permission `resource:update` required if the current user is the maintainer, `resource:update_any` otherwise. + * Permission `workflow:list` required. */ - public static resourceVersionRequestResourceVersion< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - ResourceVersionRequestResourceVersionData, - ThrowOnError - >, + public static workflowListWorkflows<ThrowOnError extends boolean = true>( + options?: Options<WorkflowListWorkflowsData, ThrowOnError>, ) { - return (options?.client ?? client).post< - ResourceVersionRequestResourceVersionResponse, - ResourceVersionRequestResourceVersionError, + return (options?.client ?? _heyApiClient).get< + WorkflowListWorkflowsResponse, + WorkflowListWorkflowsError, ThrowOnError >({ + url: "/ui/workflows", ...options, - url: "/ui/resources/{rid}/versions", }); } /** - * Get version of a resource - * Get a specific resource version for a specific resource. + * Create a new workflow + * Create a new workflow. * - * Permission `resource:read` required. If the status of the resource version is not `LATEST` or `SYNCHRONIZED` and - * the current user is not the maintainer, then the permission `resource:read_any` is required. + * For private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed. + * + * For private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed. + * + * Permission `workflow:create` required. */ - public static resourceVersionGetResourceVersion< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - ResourceVersionGetResourceVersionData, - ThrowOnError - >, + public static workflowCreateWorkflow<ThrowOnError extends boolean = true>( + options: Options<WorkflowCreateWorkflowData, ThrowOnError>, ) { - return (options?.client ?? client).get< - ResourceVersionGetResourceVersionResponse, - ResourceVersionGetResourceVersionError, + return (options.client ?? _heyApiClient).post< + WorkflowCreateWorkflowResponse, + WorkflowCreateWorkflowError, ThrowOnError >({ + url: "/ui/workflows", ...options, - url: "/ui/resources/{rid}/versions/{rvid}", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } /** - * Download folder structure of resource - * Get the folder structure of the resources. Only available if the resource was previously downloaded to the cluster. + * List workflow OTRs + * Get the ownership transfer requests for workflows. * - * Permission `resource:read` required. + * Permission `workflow:list` required if `current_owner_id` or `new_owner_id` is the current users id, + * otherwise `workflow:list_all` */ - public static resourceVersionResourceFileTree< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - ResourceVersionResourceFileTreeData, - ThrowOnError - >, + public static workflowListWorkflowOtrs<ThrowOnError extends boolean = true>( + options?: Options<WorkflowListWorkflowOtrsData, ThrowOnError>, ) { - return (options?.client ?? client).get< - ResourceVersionResourceFileTreeResponse, - ResourceVersionResourceFileTreeError, + return (options?.client ?? _heyApiClient).get< + WorkflowListWorkflowOtrsResponse, + WorkflowListWorkflowOtrsError, ThrowOnError >({ + url: "/ui/workflows/ownership_transfer_request", ...options, - url: "/ui/resources/{rid}/versions/{rvid}/tree", }); } /** - * Request resource version review - * Request the review of a resource version. + * Get anonymized workflow execution + * Get the workflow executions with meta information and anonymized user IDs. * - * Permission `resource:update` required. + * Permission `workflow:read` required if the `developer_id` is the same as the uid of the current user, + * other `workflow:read_any`. */ - public static resourceVersionRequestResourceVersionReview< + public static workflowGetDeveloperWorkflowStatistics< ThrowOnError extends boolean = true, >( - options: OptionsLegacyParser< - ResourceVersionRequestResourceVersionReviewData, - ThrowOnError - >, + options?: Options<WorkflowGetDeveloperWorkflowStatisticsData, ThrowOnError>, ) { - return (options?.client ?? client).put< - ResourceVersionRequestResourceVersionReviewResponse, - ResourceVersionRequestResourceVersionReviewError, + return (options?.client ?? _heyApiClient).get< + WorkflowGetDeveloperWorkflowStatisticsResponse, + WorkflowGetDeveloperWorkflowStatisticsError, ThrowOnError >({ + url: "/ui/workflows/developer_statistics", ...options, - url: "/ui/resources/{rid}/versions/{rvid}/request_review", }); } /** - * Request resource version synchronization - * Request the synchronization of a resource version to the cluster. + * Delete a workflow + * Delete a workflow. * - * Permission `resource:request_sync` required. + * Permission `workflow:delete` required if the `developer_id` is the same as the uid of the current user, + * other `workflow:delete_any`. */ - public static resourceVersionRequestResourceVersionSync< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - ResourceVersionRequestResourceVersionSyncData, - ThrowOnError - >, + public static workflowDeleteWorkflow<ThrowOnError extends boolean = true>( + options: Options<WorkflowDeleteWorkflowData, ThrowOnError>, ) { - return (options?.client ?? client).put< - ResourceVersionRequestResourceVersionSyncResponse, - ResourceVersionRequestResourceVersionSyncError, + return (options.client ?? _heyApiClient).delete< + WorkflowDeleteWorkflowResponse, + WorkflowDeleteWorkflowError, ThrowOnError >({ + url: "/ui/workflows/{wid}", ...options, - url: "/ui/resources/{rid}/versions/{rvid}/request_sync", }); } /** - * Review resource version - * Review answer the resource version. + * Get a workflow + * Get a specific workflow. * - * Permission `resource:update_status` required. + * Permission `workflow:read` required. */ - public static resourceVersionResourceVersionReview< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - ResourceVersionResourceVersionReviewData, - ThrowOnError - >, + public static workflowGetWorkflow<ThrowOnError extends boolean = true>( + options: Options<WorkflowGetWorkflowData, ThrowOnError>, ) { - return (options?.client ?? client).put< - ResourceVersionResourceVersionReviewResponse, - ResourceVersionResourceVersionReviewError, + return (options.client ?? _heyApiClient).get< + WorkflowGetWorkflowResponse, + WorkflowGetWorkflowError, ThrowOnError >({ + url: "/ui/workflows/{wid}", ...options, - url: "/ui/resources/{rid}/versions/{rvid}/review", }); } /** - * Synchronize resource version with cluster - * Synchronize the resource version to the cluster. + * Delete a workflow OTR + * Delete/Reject a workflow ownership transfer request. * - * Permission `resource:update_any` required. + * Permission `workflow:update` required if current user is the current or new owner of the workflow, + * otherwise `workflow:update_any` required. */ - public static resourceVersionResourceVersionSync< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - ResourceVersionResourceVersionSyncData, - ThrowOnError - >, + public static workflowDeleteWorkflowOtr<ThrowOnError extends boolean = true>( + options: Options<WorkflowDeleteWorkflowOtrData, ThrowOnError>, ) { - return (options?.client ?? client).put< - ResourceVersionResourceVersionSyncResponse, - ResourceVersionResourceVersionSyncError, + return (options.client ?? _heyApiClient).delete< + WorkflowDeleteWorkflowOtrResponse, + WorkflowDeleteWorkflowOtrError, ThrowOnError >({ + url: "/ui/workflows/{wid}/ownership_transfer_request", ...options, - url: "/ui/resources/{rid}/versions/{rvid}/sync", }); } /** - * Set resource version to latest - * Set the resource version as the latest version. + * Get a workflow OTR + * Get a specific workflow ownership transfer request. * - * Permission `resource:update_any` required. + * Permission `workflow:read` required if current user is the current or new owner of the workflow, + * otherwise `workflow:read_any` required. */ - public static resourceVersionResourceVersionLatest< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - ResourceVersionResourceVersionLatestData, - ThrowOnError - >, + public static workflowGetWorkflowOtr<ThrowOnError extends boolean = true>( + options: Options<WorkflowGetWorkflowOtrData, ThrowOnError>, ) { - return (options?.client ?? client).put< - ResourceVersionResourceVersionLatestResponse, - ResourceVersionResourceVersionLatestError, + return (options.client ?? _heyApiClient).get< + WorkflowGetWorkflowOtrResponse, + WorkflowGetWorkflowOtrError, ThrowOnError >({ + url: "/ui/workflows/{wid}/ownership_transfer_request", ...options, - url: "/ui/resources/{rid}/versions/{rvid}/latest", }); } /** - * Delete resource version on cluster - * Delete the resource version on the cluster. + * Accept a workflow OTR + * Accept an ownership transfer request for a specific workflow. * - * Permission `resource:delete_any` required. + * Permission `workflow:update` required if the current user is the new owner of the workflow, + * otherwise `workflow:update_any` required. */ - public static resourceVersionDeleteResourceVersionCluster< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - ResourceVersionDeleteResourceVersionClusterData, - ThrowOnError - >, + public static workflowAcceptWorkflowOtr<ThrowOnError extends boolean = true>( + options: Options<WorkflowAcceptWorkflowOtrData, ThrowOnError>, ) { - return (options?.client ?? client).delete< - ResourceVersionDeleteResourceVersionClusterResponse, - ResourceVersionDeleteResourceVersionClusterError, + return (options.client ?? _heyApiClient).patch< + WorkflowAcceptWorkflowOtrResponse, + WorkflowAcceptWorkflowOtrError, ThrowOnError >({ + url: "/ui/workflows/{wid}/ownership_transfer_request", ...options, - url: "/ui/resources/{rid}/versions/{rvid}/cluster", }); } /** - * Delete resource version in S3 - * Delete the resource version in the S3 bucket. + * Create a workflow OTR + * Create a ownership transfer request for a specific workflow. * - * Permission `resource:delete_any` required. + * Permission `workflow:update` required if the current user is the current owner of the workflow, + * otherwise `workflow:update_any` required. */ - public static resourceVersionDeleteResourceVersionS3< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - ResourceVersionDeleteResourceVersionS3Data, - ThrowOnError - >, + public static workflowCreateWorkflowOtr<ThrowOnError extends boolean = true>( + options: Options<WorkflowCreateWorkflowOtrData, ThrowOnError>, ) { - return (options?.client ?? client).delete< - ResourceVersionDeleteResourceVersionS3Response, - ResourceVersionDeleteResourceVersionS3Error, + return (options.client ?? _heyApiClient).post< + WorkflowCreateWorkflowOtrResponse, + WorkflowCreateWorkflowOtrError, ThrowOnError >({ + url: "/ui/workflows/{wid}/ownership_transfer_request", ...options, - url: "/ui/resources/{rid}/versions/{rvid}/s3", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } -} -export class S3KeyService { /** - * Get the S3 Access keys from a user - * Get all the S3 Access keys for a specific user. + * Get statistics for a workflow + * Get the number of started workflow per day. * - * Permission `s3_key:list` required if the current user is the target, otherwise `s3_key:list_all` required. + * Permission `workflow:read` required. */ - public static s3KeyGetUserKeys<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<S3KeyGetUserKeysData, ThrowOnError>, - ) { - return (options?.client ?? client).get< - S3KeyGetUserKeysResponse, - S3KeyGetUserKeysError, + public static workflowGetWorkflowStatistics< + ThrowOnError extends boolean = true, + >(options: Options<WorkflowGetWorkflowStatisticsData, ThrowOnError>) { + return (options.client ?? _heyApiClient).get< + WorkflowGetWorkflowStatisticsResponse, + WorkflowGetWorkflowStatisticsError, ThrowOnError >({ + url: "/ui/workflows/{wid}/statistics", ...options, - url: "/ui/users/{uid}/keys", }); } /** - * Create a Access key for a user - * Create a S3 Access key for a specific user. + * Update a workflow + * Create a new workflow version. * - * Permission `s3_key:create` required if the current user is the target, otherwise `s3_key:create_any` required. + * Permission `workflow:update` required. */ - public static s3KeyCreateUserKey<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<S3KeyCreateUserKeyData, ThrowOnError>, + public static workflowUpdateWorkflow<ThrowOnError extends boolean = true>( + options: Options<WorkflowUpdateWorkflowData, ThrowOnError>, ) { - return (options?.client ?? client).post< - S3KeyCreateUserKeyResponse, - S3KeyCreateUserKeyError, + return (options.client ?? _heyApiClient).post< + WorkflowUpdateWorkflowResponse, + WorkflowUpdateWorkflowError, ThrowOnError >({ + url: "/ui/workflows/{wid}/update", ...options, - url: "/ui/users/{uid}/keys", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } +} +export class WorkflowVersionService { /** - * Get a specific S3 Access key from a user - * Get a specific S3 Access Key for a specific user. + * Get all versions of a workflow + * List all versions of a Workflow. * - * Permission `s3_key:read` required if the current user is the target, otherwise `s3_key:read_any` required. + * Permission `workflow:list` required. */ - public static s3KeyGetUserKey<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<S3KeyGetUserKeyData, ThrowOnError>, - ) { - return (options?.client ?? client).get< - S3KeyGetUserKeyResponse, - S3KeyGetUserKeyError, + public static workflowVersionListWorkflowVersion< + ThrowOnError extends boolean = true, + >(options: Options<WorkflowVersionListWorkflowVersionData, ThrowOnError>) { + return (options.client ?? _heyApiClient).get< + WorkflowVersionListWorkflowVersionResponse, + WorkflowVersionListWorkflowVersionError, ThrowOnError >({ + url: "/ui/workflows/{wid}/versions", ...options, - url: "/ui/users/{uid}/keys/{access_id}", }); } /** - * Delete a specific S3 Access key from a user - * Delete a specific S3 Access key for a specific user. + * Get a workflow version + * Get a specific version of a workflow. * - * Permission `s3_key:delete` required if the current user is the target, otherwise `s3_key:delete_any` required. + * Permission `workflow:read` required if the version is public or you are the developer of the workflow, + * otherwise `workflow:read_any` */ - public static s3KeyDeleteUserKey<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<S3KeyDeleteUserKeyData, ThrowOnError>, - ) { - return (options?.client ?? client).delete< - S3KeyDeleteUserKeyResponse, - S3KeyDeleteUserKeyError, + public static workflowVersionGetWorkflowVersion< + ThrowOnError extends boolean = true, + >(options: Options<WorkflowVersionGetWorkflowVersionData, ThrowOnError>) { + return (options.client ?? _heyApiClient).get< + WorkflowVersionGetWorkflowVersionResponse, + WorkflowVersionGetWorkflowVersionError, ThrowOnError >({ + url: "/ui/workflows/{wid}/versions/{git_commit_hash}", ...options, - url: "/ui/users/{uid}/keys/{access_id}", }); } -} -export class UserService { /** - * Create User - * Create a new user in the system and notify him. + * Update status of workflow version + * Update the status of a workflow version. * - * Permission `user:create` required. + * Permission `workflow:update_status` */ - public static userCreateUser<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<UserCreateUserData, ThrowOnError>, + public static workflowVersionUpdateWorkflowVersionStatus< + ThrowOnError extends boolean = true, + >( + options: Options< + WorkflowVersionUpdateWorkflowVersionStatusData, + ThrowOnError + >, ) { - return (options?.client ?? client).post< - UserCreateUserResponse, - UserCreateUserError, + return (options.client ?? _heyApiClient).patch< + WorkflowVersionUpdateWorkflowVersionStatusResponse, + WorkflowVersionUpdateWorkflowVersionStatusError, ThrowOnError >({ + url: "/ui/workflows/{wid}/versions/{git_commit_hash}/status", ...options, - url: "/ui/users", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } /** - * List users and search by their name - * List all users in the system.. + * Get metadata of workflow version + * Get the metadata of a workflow version. * - * Permission `user:list` required. + * Permission `workflow:read` required if the current user is the developer of the workflow, + * otherwise `workflow:read_any` */ - public static userListUsers<ThrowOnError extends boolean = true>( - options?: OptionsLegacyParser<UserListUsersData, ThrowOnError>, + public static workflowVersionGetWorkflowVersionMetadata< + ThrowOnError extends boolean = true, + >( + options: Options< + WorkflowVersionGetWorkflowVersionMetadataData, + ThrowOnError + >, ) { - return (options?.client ?? client).get< - UserListUsersResponse, - UserListUsersError, + return (options.client ?? _heyApiClient).get< + WorkflowVersionGetWorkflowVersionMetadataResponse, + WorkflowVersionGetWorkflowVersionMetadataError, ThrowOnError >({ + url: "/ui/workflows/{wid}/versions/{git_commit_hash}/metadata", ...options, - url: "/ui/users", }); } /** - * Search Users - * Search for users in the system by their name. + * Update metadata of workflow version + * Update the metadata of a workflow version. * - * Permission `user: search` required. + * Permission `workflow:update` required if the current user is the developer of the workflow, + * otherwise `workflow:update_any` */ - public static userSearchUsers<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<UserSearchUsersData, ThrowOnError>, + public static workflowVersionUpdateWorkflowVersionMetadata< + ThrowOnError extends boolean = true, + >( + options: Options< + WorkflowVersionUpdateWorkflowVersionMetadataData, + ThrowOnError + >, ) { - return (options?.client ?? client).get< - UserSearchUsersResponse, - UserSearchUsersError, + return (options.client ?? _heyApiClient).put< + WorkflowVersionUpdateWorkflowVersionMetadataResponse, + WorkflowVersionUpdateWorkflowVersionMetadataError, ThrowOnError >({ + url: "/ui/workflows/{wid}/versions/{git_commit_hash}/metadata", ...options, - url: "/ui/users/search", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } /** - * Get the logged in user - * Return the user associated with the used JWT. + * Deprecate a workflow version + * Deprecate a workflow version. * - * Permission `user:read` required. + * Permission `workflow:update` required if you are the developer of the workflow, + * otherwise `workflow:update_status` */ - public static userGetLoggedInUser<ThrowOnError extends boolean = true>( - options?: OptionsLegacyParser<unknown, ThrowOnError>, + public static workflowVersionDeprecateWorkflowVersion< + ThrowOnError extends boolean = true, + >( + options: Options<WorkflowVersionDeprecateWorkflowVersionData, ThrowOnError>, ) { - return (options?.client ?? client).get< - UserGetLoggedInUserResponse, - UserGetLoggedInUserError, + return (options.client ?? _heyApiClient).patch< + WorkflowVersionDeprecateWorkflowVersionResponse, + WorkflowVersionDeprecateWorkflowVersionError, ThrowOnError >({ + url: "/ui/workflows/{wid}/versions/{git_commit_hash}/deprecate", ...options, - url: "/ui/users/me", }); } /** - * Get a user by its uid - * Return the user with the specific uid. + * Update parameter extension of workflow version + * Update the parameter extension of a workflow version. * - * Permission `user:read` required. + * Permission `workflow:update` required. */ - public static userGetUser<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<UserGetUserData, ThrowOnError>, + public static workflowVersionUpdateWorkflowVersionParameterExtension< + ThrowOnError extends boolean = true, + >( + options: Options< + WorkflowVersionUpdateWorkflowVersionParameterExtensionData, + ThrowOnError + >, ) { - return (options?.client ?? client).get< - UserGetUserResponse, - UserGetUserError, + return (options.client ?? _heyApiClient).patch< + WorkflowVersionUpdateWorkflowVersionParameterExtensionResponse, + WorkflowVersionUpdateWorkflowVersionParameterExtensionError, ThrowOnError >({ + url: "/ui/workflows/{wid}/versions/{git_commit_hash}/parameter-extension", ...options, - url: "/ui/users/{uid}", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } /** - * Update user roles - * Update the roles of a user. + * Fetch documentation for a workflow version + * Get the documentation for a specific workflow version. + * Streams the response directly from the right git repository. * - * Permission `user:update` required. + * Permission `workflow:read` required. */ - public static userUpdateRoles<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<UserUpdateRolesData, ThrowOnError>, + public static workflowVersionDownloadWorkflowDocumentation< + ThrowOnError extends boolean = true, + >( + options: Options< + WorkflowVersionDownloadWorkflowDocumentationData, + ThrowOnError + >, ) { - return (options?.client ?? client).put< - UserUpdateRolesResponse, - UserUpdateRolesError, + return (options.client ?? _heyApiClient).get< + unknown, + WorkflowVersionDownloadWorkflowDocumentationError, ThrowOnError >({ + url: "/ui/workflows/{wid}/versions/{git_commit_hash}/documentation", ...options, - url: "/ui/users/{uid}/roles", }); } /** - * Resend Invitation - * Resend the invitation link for an user that has an open invitation. + * Delete icon of workflow version + * Delete the icon of the workflow version. * - * Permission `user:create` required. + * Permission `workflow:update` required. */ - public static userResendInvitation<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<UserResendInvitationData, ThrowOnError>, + public static workflowVersionDeleteWorkflowVersionIcon< + ThrowOnError extends boolean = true, + >( + options: Options< + WorkflowVersionDeleteWorkflowVersionIconData, + ThrowOnError + >, ) { - return (options?.client ?? client).patch< - UserResendInvitationResponse, - UserResendInvitationError, + return (options.client ?? _heyApiClient).delete< + WorkflowVersionDeleteWorkflowVersionIconResponse, + WorkflowVersionDeleteWorkflowVersionIconError, ThrowOnError >({ + url: "/ui/workflows/{wid}/versions/{git_commit_hash}/icon", ...options, - url: "/ui/users/{uid}/invitation", + }); + } + + /** + * Upload icon for workflow version + * Upload an icon for the workflow version and returns the new icon URL. + * + * Permission `workflow:update` required. + */ + public static workflowVersionUploadWorkflowVersionIcon< + ThrowOnError extends boolean = true, + >( + options: Options< + WorkflowVersionUploadWorkflowVersionIconData, + ThrowOnError + >, + ) { + return (options.client ?? _heyApiClient).post< + WorkflowVersionUploadWorkflowVersionIconResponse, + WorkflowVersionUploadWorkflowVersionIconError, + ThrowOnError + >({ + ...formDataBodySerializer, + url: "/ui/workflows/{wid}/versions/{git_commit_hash}/icon", + ...options, + headers: { + "Content-Type": null, + ...options?.headers, + }, }); } } -export class WorkflowService { +export class WorkflowExecutionService { /** - * Create a new workflow - * Create a new workflow. + * List all workflow executions + * Get all workflow executions. + * + * This endpoint enforces keyset pagination. To iterate over all workflow executions, follow the link provided in the + * `Link` header. + * A missing `Link` header indicates that you iterated over all workflow executions with the current filters. + * + * Permission `workflow_execution:list` required, if `executor_id` is the same as the current user, + * otherwise `workflow_execution:list_all` required. + */ + public static workflowExecutionListWorkflowExecutions< + ThrowOnError extends boolean = true, + >( + options?: Options< + WorkflowExecutionListWorkflowExecutionsData, + ThrowOnError + >, + ) { + return (options?.client ?? _heyApiClient).get< + WorkflowExecutionListWorkflowExecutionsResponse, + WorkflowExecutionListWorkflowExecutionsError, + ThrowOnError + >({ + url: "/ui/workflow_executions", + ...options, + }); + } + + /** + * Start a new workflow execution + * Start a new workflow execution. Workflow versions wit status `DEPRECATED` or `DENIED` can't be started. + * + * Permission `workflow_execution:create` required if workflow versions status is `PUBLISHED`, + * otherwise `workflow_execution:create_any` required. + */ + public static workflowExecutionStartWorkflow< + ThrowOnError extends boolean = true, + >(options: Options<WorkflowExecutionStartWorkflowData, ThrowOnError>) { + return (options.client ?? _heyApiClient).post< + WorkflowExecutionStartWorkflowResponse, + WorkflowExecutionStartWorkflowError, + ThrowOnError + >({ + url: "/ui/workflow_executions", + ...options, + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, + }); + } + + /** + * Start a workflow execution with arbitrary git repository + * Start a new workflow execution from an arbitrary git repository. * * For private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed. * @@ -1581,779 +1691,791 @@ export class WorkflowService { * * Permission `workflow:create` required. */ - public static workflowCreateWorkflow<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<WorkflowCreateWorkflowData, ThrowOnError>, + public static workflowExecutionStartArbitraryWorkflow< + ThrowOnError extends boolean = true, + >( + options: Options<WorkflowExecutionStartArbitraryWorkflowData, ThrowOnError>, ) { - return (options?.client ?? client).post< - WorkflowCreateWorkflowResponse, - WorkflowCreateWorkflowError, + return (options.client ?? _heyApiClient).post< + WorkflowExecutionStartArbitraryWorkflowResponse, + WorkflowExecutionStartArbitraryWorkflowError, ThrowOnError >({ + url: "/ui/workflow_executions/arbitrary", ...options, - url: "/ui/workflows", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } /** - * List workflows - * List all workflows. + * Delete a workflow execution + * Delete a specific workflow execution. * - * Permission `workflow:list` required. + * Permission `workflow_execution:delete` required if the current user started the workflow execution, + * otherwise `workflow_execution:delete_any` required. */ - public static workflowListWorkflows<ThrowOnError extends boolean = true>( - options?: OptionsLegacyParser<WorkflowListWorkflowsData, ThrowOnError>, + public static workflowExecutionDeleteWorkflowExecution< + ThrowOnError extends boolean = true, + >( + options: Options< + WorkflowExecutionDeleteWorkflowExecutionData, + ThrowOnError + >, ) { - return (options?.client ?? client).get< - WorkflowListWorkflowsResponse, - WorkflowListWorkflowsError, + return (options.client ?? _heyApiClient).delete< + WorkflowExecutionDeleteWorkflowExecutionResponse, + WorkflowExecutionDeleteWorkflowExecutionError, ThrowOnError >({ + url: "/ui/workflow_executions/{eid}", ...options, - url: "/ui/workflows", }); } /** - * List workflow OTRs - * Get the ownership transfer requests for workflows. + * Get a workflow execution + * Get a specific workflow execution. * - * Permission `workflow:list` required if `current_owner_id` or `new_owner_id` is the current users id, - * otherwise `workflow:list_all` + * Permission `workflow_execution:read` required if the current user started the workflow execution, + * otherwise `workflow_execution:read_any` required. */ - public static workflowListWorkflowOtrs<ThrowOnError extends boolean = true>( - options?: OptionsLegacyParser<WorkflowListWorkflowOtrsData, ThrowOnError>, - ) { - return (options?.client ?? client).get< - WorkflowListWorkflowOtrsResponse, - WorkflowListWorkflowOtrsError, + public static workflowExecutionGetWorkflowExecution< + ThrowOnError extends boolean = true, + >(options: Options<WorkflowExecutionGetWorkflowExecutionData, ThrowOnError>) { + return (options.client ?? _heyApiClient).get< + WorkflowExecutionGetWorkflowExecutionResponse, + WorkflowExecutionGetWorkflowExecutionError, ThrowOnError >({ + url: "/ui/workflow_executions/{eid}", ...options, - url: "/ui/workflows/ownership_transfer_request", }); } /** - * Get anonymized workflow execution - * Get the workflow executions with meta information and anonymized user IDs. + * Get the parameters of a workflow execution + * Get the parameters of a specific workflow execution. * - * Permission `workflow:read` required if the `developer_id` is the same as the uid of the current user, - * other `workflow:read_any`. + * Permission `workflow_execution:read` required if the current user started the workflow execution, + * otherwise `workflow_execution:read_any` required. */ - public static workflowGetDeveloperWorkflowStatistics< + public static workflowExecutionGetWorkflowExecutionParams< ThrowOnError extends boolean = true, >( - options?: OptionsLegacyParser< - WorkflowGetDeveloperWorkflowStatisticsData, + options: Options< + WorkflowExecutionGetWorkflowExecutionParamsData, ThrowOnError >, ) { - return (options?.client ?? client).get< - WorkflowGetDeveloperWorkflowStatisticsResponse, - WorkflowGetDeveloperWorkflowStatisticsError, + return (options.client ?? _heyApiClient).get< + WorkflowExecutionGetWorkflowExecutionParamsResponse, + WorkflowExecutionGetWorkflowExecutionParamsError, ThrowOnError >({ + url: "/ui/workflow_executions/{eid}/params", ...options, - url: "/ui/workflows/developer_statistics", - responseTransformer: - WorkflowGetDeveloperWorkflowStatisticsResponseTransformer, }); } /** - * Get a workflow - * Get a specific workflow. + * Cancel a workflow execution + * Cancel a running workflow execution. * - * Permission `workflow:read` required. + * Permission `workflow_execution:cancel` required if the current user started the workflow execution, + * otherwise `workflow_execution:cancel_any` required. */ - public static workflowGetWorkflow<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<WorkflowGetWorkflowData, ThrowOnError>, + public static workflowExecutionCancelWorkflowExecution< + ThrowOnError extends boolean = true, + >( + options: Options< + WorkflowExecutionCancelWorkflowExecutionData, + ThrowOnError + >, ) { - return (options?.client ?? client).get< - WorkflowGetWorkflowResponse, - WorkflowGetWorkflowError, + return (options.client ?? _heyApiClient).post< + WorkflowExecutionCancelWorkflowExecutionResponse, + WorkflowExecutionCancelWorkflowExecutionError, ThrowOnError >({ + url: "/ui/workflow_executions/{eid}/cancel", ...options, - url: "/ui/workflows/{wid}", }); } +} +export class WorkflowCredentialsService { /** - * Delete a workflow - * Delete a workflow. + * Delete the credentials of a workflow + * Delete the credentials for the repository of a workflow. * - * Permission `workflow:delete` required if the `developer_id` is the same as the uid of the current user, + * Permission `workflow:delete` required if the developer of the workflow is the same as the current user, * other `workflow:delete_any`. */ - public static workflowDeleteWorkflow<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<WorkflowDeleteWorkflowData, ThrowOnError>, + public static workflowCredentialsDeleteWorkflowCredentials< + ThrowOnError extends boolean = true, + >( + options: Options< + WorkflowCredentialsDeleteWorkflowCredentialsData, + ThrowOnError + >, ) { - return (options?.client ?? client).delete< - WorkflowDeleteWorkflowResponse, - WorkflowDeleteWorkflowError, + return (options.client ?? _heyApiClient).delete< + WorkflowCredentialsDeleteWorkflowCredentialsResponse, + WorkflowCredentialsDeleteWorkflowCredentialsError, ThrowOnError >({ + url: "/ui/workflows/{wid}/credentials", ...options, - url: "/ui/workflows/{wid}", }); } /** - * Get a workflow OTR - * Get a specific workflow ownership transfer request. + * Get the credentials of a workflow + * Get the credentials for the repository of a workflow. Only the developer of a workflow can do this. * - * Permission `workflow:read` required if current user is the current or new owner of the workflow, - * otherwise `workflow:read_any` required. + * Permission `workflow:update` required. */ - public static workflowGetWorkflowOtr<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<WorkflowGetWorkflowOtrData, ThrowOnError>, + public static workflowCredentialsGetWorkflowCredentials< + ThrowOnError extends boolean = true, + >( + options: Options< + WorkflowCredentialsGetWorkflowCredentialsData, + ThrowOnError + >, ) { - return (options?.client ?? client).get< - WorkflowGetWorkflowOtrResponse, - WorkflowGetWorkflowOtrError, + return (options.client ?? _heyApiClient).get< + WorkflowCredentialsGetWorkflowCredentialsResponse, + WorkflowCredentialsGetWorkflowCredentialsError, ThrowOnError >({ + url: "/ui/workflows/{wid}/credentials", ...options, - url: "/ui/workflows/{wid}/ownership_transfer_request", }); } /** - * Create a workflow OTR - * Create a ownership transfer request for a specific workflow. + * Update the credentials of a workflow + * Update the credentials for the repository of a workflow. * - * Permission `workflow:update` required if the current user is the current owner of the workflow, - * otherwise `workflow:update_any` required. + * Permission `workflow:update` required. */ - public static workflowCreateWorkflowOtr<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<WorkflowCreateWorkflowOtrData, ThrowOnError>, + public static workflowCredentialsUpdateWorkflowCredentials< + ThrowOnError extends boolean = true, + >( + options: Options< + WorkflowCredentialsUpdateWorkflowCredentialsData, + ThrowOnError + >, + ) { + return (options.client ?? _heyApiClient).put< + unknown, + WorkflowCredentialsUpdateWorkflowCredentialsError, + ThrowOnError + >({ + url: "/ui/workflows/{wid}/credentials", + ...options, + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, + }); + } +} + +export class WorkflowModeService { + /** + * Get workflow mode + * Get a workflow mode. + * + * Permission `workflow:read` required + */ + public static workflowModeGetWorkflowMode< + ThrowOnError extends boolean = true, + >(options: Options<WorkflowModeGetWorkflowModeData, ThrowOnError>) { + return (options.client ?? _heyApiClient).get< + WorkflowModeGetWorkflowModeResponse, + WorkflowModeGetWorkflowModeError, + ThrowOnError + >({ + url: "/ui/workflow_modes/{mode_id}", + ...options, + }); + } +} + +export class ResourceService { + /** + * List resources + * List all resources. + * + * Permission `resource:list` required. + */ + public static resourceListResources<ThrowOnError extends boolean = true>( + options?: Options<ResourceListResourcesData, ThrowOnError>, + ) { + return (options?.client ?? _heyApiClient).get< + ResourceListResourcesResponse, + ResourceListResourcesError, + ThrowOnError + >({ + url: "/ui/resources", + ...options, + }); + } + + /** + * Request a new resource + * Request a new resources. + * + * Permission `resource:create` required. + */ + public static resourceCreateResource<ThrowOnError extends boolean = true>( + options: Options<ResourceCreateResourceData, ThrowOnError>, ) { - return (options?.client ?? client).post< - WorkflowCreateWorkflowOtrResponse, - WorkflowCreateWorkflowOtrError, + return (options.client ?? _heyApiClient).post< + ResourceCreateResourceResponse, + ResourceCreateResourceError, ThrowOnError >({ + url: "/ui/resources", ...options, - url: "/ui/workflows/{wid}/ownership_transfer_request", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } /** - * Accept a workflow OTR - * Accept an ownership transfer request for a specific workflow. + * List resource sync requests + * List all resource sync requests. * - * Permission `workflow:update` required if the current user is the new owner of the workflow, - * otherwise `workflow:update_any` required. + * Permission `resource:update_any` required. */ - public static workflowAcceptWorkflowOtr<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<WorkflowAcceptWorkflowOtrData, ThrowOnError>, + public static resourceListSyncRequests<ThrowOnError extends boolean = true>( + options?: Options<ResourceListSyncRequestsData, ThrowOnError>, ) { - return (options?.client ?? client).patch< - WorkflowAcceptWorkflowOtrResponse, - WorkflowAcceptWorkflowOtrError, + return (options?.client ?? _heyApiClient).get< + ResourceListSyncRequestsResponse, + unknown, ThrowOnError >({ + url: "/ui/resources/sync_requests", ...options, - url: "/ui/workflows/{wid}/ownership_transfer_request", }); } /** - * Delete a workflow OTR - * Delete/Reject a workflow ownership transfer request. + * List resource OTRs + * Get the ownership transfer requests for resources. * - * Permission `workflow:update` required if current user is the current or new owner of the workflow, - * otherwise `workflow:update_any` required. + * Permission `resource:list` required if `current_owner_id` or `new_owner_id` is the current users id, + * otherwise `resource:list_all` */ - public static workflowDeleteWorkflowOtr<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<WorkflowDeleteWorkflowOtrData, ThrowOnError>, + public static resourceListResourceOtrs<ThrowOnError extends boolean = true>( + options?: Options<ResourceListResourceOtrsData, ThrowOnError>, ) { - return (options?.client ?? client).delete< - WorkflowDeleteWorkflowOtrResponse, - WorkflowDeleteWorkflowOtrError, + return (options?.client ?? _heyApiClient).get< + ResourceListResourceOtrsResponse, + ResourceListResourceOtrsError, ThrowOnError >({ + url: "/ui/resources/ownership_transfer_request", ...options, - url: "/ui/workflows/{wid}/ownership_transfer_request", }); } /** - * Get statistics for a workflow - * Get the number of started workflow per day. + * Delete a resource + * Delete a resources. * - * Permission `workflow:read` required. + * Permission `resource:delete` required. */ - public static workflowGetWorkflowStatistics< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - WorkflowGetWorkflowStatisticsData, - ThrowOnError - >, + public static resourceDeleteResource<ThrowOnError extends boolean = true>( + options: Options<ResourceDeleteResourceData, ThrowOnError>, ) { - return (options?.client ?? client).get< - WorkflowGetWorkflowStatisticsResponse, - WorkflowGetWorkflowStatisticsError, + return (options.client ?? _heyApiClient).delete< + ResourceDeleteResourceResponse, + ResourceDeleteResourceError, ThrowOnError >({ + url: "/ui/resources/{rid}", ...options, - url: "/ui/workflows/{wid}/statistics", - responseTransformer: WorkflowGetWorkflowStatisticsResponseTransformer, }); } /** - * Update a workflow - * Create a new workflow version. + * Get a resource + * Get a specific resource. * - * Permission `workflow:update` required. + * Permission `resource:read` required. */ - public static workflowUpdateWorkflow<ThrowOnError extends boolean = true>( - options: OptionsLegacyParser<WorkflowUpdateWorkflowData, ThrowOnError>, + public static resourceGetResource<ThrowOnError extends boolean = true>( + options: Options<ResourceGetResourceData, ThrowOnError>, ) { - return (options?.client ?? client).post< - WorkflowUpdateWorkflowResponse, - WorkflowUpdateWorkflowError, + return (options.client ?? _heyApiClient).get< + ResourceGetResourceResponse, + ResourceGetResourceError, ThrowOnError >({ + url: "/ui/resources/{rid}", ...options, - url: "/ui/workflows/{wid}/update", }); } -} -export class WorkflowCredentialsService { /** - * Get the credentials of a workflow - * Get the credentials for the repository of a workflow. Only the developer of a workflow can do this. + * Delete a resource OTR + * Delete/Reject a resource ownership transfer request. * - * Permission `workflow:update` required. + * Permission `resource:update` required if the current user is the current or new owner of the resource, + * otherwise `resource:update_any` required. */ - public static workflowCredentialsGetWorkflowCredentials< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - WorkflowCredentialsGetWorkflowCredentialsData, - ThrowOnError - >, + public static resourceDeleteResourceOtr<ThrowOnError extends boolean = true>( + options: Options<ResourceDeleteResourceOtrData, ThrowOnError>, ) { - return (options?.client ?? client).get< - WorkflowCredentialsGetWorkflowCredentialsResponse, - WorkflowCredentialsGetWorkflowCredentialsError, + return (options.client ?? _heyApiClient).delete< + ResourceDeleteResourceOtrResponse, + ResourceDeleteResourceOtrError, ThrowOnError >({ + url: "/ui/resources/{rid}/ownership_transfer_request", ...options, - url: "/ui/workflows/{wid}/credentials", }); } /** - * Update the credentials of a workflow - * Update the credentials for the repository of a workflow. + * Get a resource OTR + * Get a specific resource ownership transfer request. * - * Permission `workflow:update` required. + * Permission `resource:read` required if the current user is the current or new owner of the resource, + * otherwise `resource:read_any` required. */ - public static workflowCredentialsUpdateWorkflowCredentials< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - WorkflowCredentialsUpdateWorkflowCredentialsData, - ThrowOnError - >, + public static resourceGetResourceOtr<ThrowOnError extends boolean = true>( + options: Options<ResourceGetResourceOtrData, ThrowOnError>, ) { - return (options?.client ?? client).put< - WorkflowCredentialsUpdateWorkflowCredentialsResponse, - WorkflowCredentialsUpdateWorkflowCredentialsError, + return (options.client ?? _heyApiClient).get< + ResourceGetResourceOtrResponse, + ResourceGetResourceOtrError, ThrowOnError >({ + url: "/ui/resources/{rid}/ownership_transfer_request", ...options, - url: "/ui/workflows/{wid}/credentials", }); } /** - * Delete the credentials of a workflow - * Delete the credentials for the repository of a workflow. + * Accept a resource OTR + * Accept an ownership transfer request for a specific resource. * - * Permission `workflow:delete` required if the developer of the workflow is the same as the current user, - * other `workflow:delete_any`. + * Permission `resource:update` required if the current user is the new owner of the resource, + * otherwise `resource:update_any` required. */ - public static workflowCredentialsDeleteWorkflowCredentials< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - WorkflowCredentialsDeleteWorkflowCredentialsData, - ThrowOnError - >, + public static resourceAcceptResourceOtr<ThrowOnError extends boolean = true>( + options: Options<ResourceAcceptResourceOtrData, ThrowOnError>, ) { - return (options?.client ?? client).delete< - WorkflowCredentialsDeleteWorkflowCredentialsResponse, - WorkflowCredentialsDeleteWorkflowCredentialsError, + return (options.client ?? _heyApiClient).patch< + ResourceAcceptResourceOtrResponse, + ResourceAcceptResourceOtrError, ThrowOnError >({ + url: "/ui/resources/{rid}/ownership_transfer_request", ...options, - url: "/ui/workflows/{wid}/credentials", }); } -} -export class WorkflowExecutionService { /** - * Start a new workflow execution - * Start a new workflow execution. Workflow versions wit status `DEPRECATED` or `DENIED` can't be started. + * Create a resource OTR + * Create a ownership transfer request for a specific resource. * - * Permission `workflow_execution:create` required if workflow versions status is `PUBLISHED`, - * otherwise `workflow_execution:create_any` required. + * Permission `resource:update` required if the current user is the current owner of the resource, + * otherwise `resource:update_any` required. */ - public static workflowExecutionStartWorkflow< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - WorkflowExecutionStartWorkflowData, - ThrowOnError - >, + public static resourceCreateResourceOtr<ThrowOnError extends boolean = true>( + options: Options<ResourceCreateResourceOtrData, ThrowOnError>, ) { - return (options?.client ?? client).post< - WorkflowExecutionStartWorkflowResponse, - WorkflowExecutionStartWorkflowError, + return (options.client ?? _heyApiClient).post< + ResourceCreateResourceOtrResponse, + ResourceCreateResourceOtrError, ThrowOnError >({ + url: "/ui/resources/{rid}/ownership_transfer_request", ...options, - url: "/ui/workflow_executions", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } +} +export class ResourceVersionService { /** - * List all workflow executions - * Get all workflow executions. - * - * This endpoint enforces keyset pagination. To iterate over all workflow executions, follow the link provided in the - * `Link` header. - * A missing `Link` header indicates that you iterated over all workflow executions with the current filters. + * List versions of a resource + * List all the resource version for a specific resource. * - * Permission `workflow_execution:list` required, if `executor_id` is the same as the current user, - * otherwise `workflow_execution:list_all` required. + * Permission 'resource:read' required. */ - public static workflowExecutionListWorkflowExecutions< + public static resourceVersionListResourceVersions< ThrowOnError extends boolean = true, - >( - options?: OptionsLegacyParser< - WorkflowExecutionListWorkflowExecutionsData, - ThrowOnError - >, - ) { - return (options?.client ?? client).get< - WorkflowExecutionListWorkflowExecutionsResponse, - WorkflowExecutionListWorkflowExecutionsError, + >(options: Options<ResourceVersionListResourceVersionsData, ThrowOnError>) { + return (options.client ?? _heyApiClient).get< + ResourceVersionListResourceVersionsResponse, + ResourceVersionListResourceVersionsError, ThrowOnError >({ + url: "/ui/resources/{rid}/versions", ...options, - url: "/ui/workflow_executions", }); } /** - * Start a workflow execution with arbitrary git repository - * Start a new workflow execution from an arbitrary git repository. - * - * For private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed. - * - * For private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed. + * Request new version of a resource + * Request a new resource version. * - * Permission `workflow:create` required. + * Permission `resource:update` required if the current user is the maintainer, `resource:update_any` otherwise. */ - public static workflowExecutionStartArbitraryWorkflow< + public static resourceVersionRequestResourceVersion< ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - WorkflowExecutionStartArbitraryWorkflowData, - ThrowOnError - >, - ) { - return (options?.client ?? client).post< - WorkflowExecutionStartArbitraryWorkflowResponse, - WorkflowExecutionStartArbitraryWorkflowError, + >(options: Options<ResourceVersionRequestResourceVersionData, ThrowOnError>) { + return (options.client ?? _heyApiClient).post< + ResourceVersionRequestResourceVersionResponse, + ResourceVersionRequestResourceVersionError, ThrowOnError >({ + url: "/ui/resources/{rid}/versions", ...options, - url: "/ui/workflow_executions/arbitrary", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } /** - * Get a workflow execution - * Get a specific workflow execution. + * Get version of a resource + * Get a specific resource version for a specific resource. * - * Permission `workflow_execution:read` required if the current user started the workflow execution, - * otherwise `workflow_execution:read_any` required. + * Permission `resource:read` required. If the status of the resource version is not `LATEST` or `SYNCHRONIZED` and + * the current user is not the maintainer, then the permission `resource:read_any` is required. */ - public static workflowExecutionGetWorkflowExecution< + public static resourceVersionGetResourceVersion< ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - WorkflowExecutionGetWorkflowExecutionData, - ThrowOnError - >, - ) { - return (options?.client ?? client).get< - WorkflowExecutionGetWorkflowExecutionResponse, - WorkflowExecutionGetWorkflowExecutionError, + >(options: Options<ResourceVersionGetResourceVersionData, ThrowOnError>) { + return (options.client ?? _heyApiClient).get< + ResourceVersionGetResourceVersionResponse, + ResourceVersionGetResourceVersionError, ThrowOnError >({ + url: "/ui/resources/{rid}/versions/{rvid}", ...options, - url: "/ui/workflow_executions/{eid}", }); } /** - * Delete a workflow execution - * Delete a specific workflow execution. + * Download folder structure of resource + * Get the folder structure of the resources. Only available if the resource was previously downloaded to the cluster. * - * Permission `workflow_execution:delete` required if the current user started the workflow execution, - * otherwise `workflow_execution:delete_any` required. + * Permission `resource:read` required. */ - public static workflowExecutionDeleteWorkflowExecution< + public static resourceVersionResourceFileTree< ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - WorkflowExecutionDeleteWorkflowExecutionData, - ThrowOnError - >, - ) { - return (options?.client ?? client).delete< - WorkflowExecutionDeleteWorkflowExecutionResponse, - WorkflowExecutionDeleteWorkflowExecutionError, + >(options: Options<ResourceVersionResourceFileTreeData, ThrowOnError>) { + return (options.client ?? _heyApiClient).get< + ResourceVersionResourceFileTreeResponse, + ResourceVersionResourceFileTreeError, ThrowOnError >({ + responseTransformer: resourceVersionResourceFileTreeResponseTransformer, + url: "/ui/resources/{rid}/versions/{rvid}/tree", ...options, - url: "/ui/workflow_executions/{eid}", }); } /** - * Get the parameters of a workflow execution - * Get the parameters of a specific workflow execution. + * Request resource version review + * Request the review of a resource version. * - * Permission `workflow_execution:read` required if the current user started the workflow execution, - * otherwise `workflow_execution:read_any` required. + * Permission `resource:update` required. */ - public static workflowExecutionGetWorkflowExecutionParams< + public static resourceVersionRequestResourceVersionReview< ThrowOnError extends boolean = true, >( - options: OptionsLegacyParser< - WorkflowExecutionGetWorkflowExecutionParamsData, + options: Options< + ResourceVersionRequestResourceVersionReviewData, ThrowOnError >, ) { - return (options?.client ?? client).get< - WorkflowExecutionGetWorkflowExecutionParamsResponse, - WorkflowExecutionGetWorkflowExecutionParamsError, + return (options.client ?? _heyApiClient).put< + ResourceVersionRequestResourceVersionReviewResponse, + ResourceVersionRequestResourceVersionReviewError, ThrowOnError >({ + url: "/ui/resources/{rid}/versions/{rvid}/request_review", ...options, - url: "/ui/workflow_executions/{eid}/params", }); } /** - * Cancel a workflow execution - * Cancel a running workflow execution. + * Request resource version synchronization + * Request the synchronization of a resource version to the cluster. * - * Permission `workflow_execution:cancel` required if the current user started the workflow execution, - * otherwise `workflow_execution:cancel_any` required. + * Permission `resource:request_sync` required. */ - public static workflowExecutionCancelWorkflowExecution< + public static resourceVersionRequestResourceVersionSync< ThrowOnError extends boolean = true, >( - options: OptionsLegacyParser< - WorkflowExecutionCancelWorkflowExecutionData, + options: Options< + ResourceVersionRequestResourceVersionSyncData, ThrowOnError >, ) { - return (options?.client ?? client).post< - WorkflowExecutionCancelWorkflowExecutionResponse, - WorkflowExecutionCancelWorkflowExecutionError, + return (options.client ?? _heyApiClient).put< + ResourceVersionRequestResourceVersionSyncResponse, + ResourceVersionRequestResourceVersionSyncError, ThrowOnError >({ + url: "/ui/resources/{rid}/versions/{rvid}/request_sync", ...options, - url: "/ui/workflow_executions/{eid}/cancel", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } -} -export class WorkflowModeService { /** - * Get workflow mode - * Get a workflow mode. + * Review resource version + * Review answer the resource version. * - * Permission `workflow:read` required + * Permission `resource:update_status` required. */ - public static workflowModeGetWorkflowMode< + public static resourceVersionResourceVersionReview< ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser<WorkflowModeGetWorkflowModeData, ThrowOnError>, - ) { - return (options?.client ?? client).get< - WorkflowModeGetWorkflowModeResponse, - WorkflowModeGetWorkflowModeError, + >(options: Options<ResourceVersionResourceVersionReviewData, ThrowOnError>) { + return (options.client ?? _heyApiClient).put< + ResourceVersionResourceVersionReviewResponse, + ResourceVersionResourceVersionReviewError, ThrowOnError >({ + url: "/ui/resources/{rid}/versions/{rvid}/review", ...options, - url: "/ui/workflow_modes/{mode_id}", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } -} -export class WorkflowVersionService { /** - * Get all versions of a workflow - * List all versions of a Workflow. + * Synchronize resource version with cluster + * Synchronize the resource version to the cluster. * - * Permission `workflow:list` required. + * Permission `resource:update_any` required. */ - public static workflowVersionListWorkflowVersion< + public static resourceVersionResourceVersionSync< ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - WorkflowVersionListWorkflowVersionData, - ThrowOnError - >, - ) { - return (options?.client ?? client).get< - WorkflowVersionListWorkflowVersionResponse, - WorkflowVersionListWorkflowVersionError, + >(options: Options<ResourceVersionResourceVersionSyncData, ThrowOnError>) { + return (options.client ?? _heyApiClient).put< + ResourceVersionResourceVersionSyncResponse, + ResourceVersionResourceVersionSyncError, ThrowOnError >({ + url: "/ui/resources/{rid}/versions/{rvid}/sync", ...options, - url: "/ui/workflows/{wid}/versions", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } /** - * Get a workflow version - * Get a specific version of a workflow. + * Set resource version to latest + * Set the resource version as the latest version. * - * Permission `workflow:read` required if the version is public or you are the developer of the workflow, - * otherwise `workflow:read_any` + * Permission `resource:update_any` required. */ - public static workflowVersionGetWorkflowVersion< + public static resourceVersionResourceVersionLatest< ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - WorkflowVersionGetWorkflowVersionData, - ThrowOnError - >, - ) { - return (options?.client ?? client).get< - WorkflowVersionGetWorkflowVersionResponse, - WorkflowVersionGetWorkflowVersionError, + >(options: Options<ResourceVersionResourceVersionLatestData, ThrowOnError>) { + return (options.client ?? _heyApiClient).put< + ResourceVersionResourceVersionLatestResponse, + ResourceVersionResourceVersionLatestError, ThrowOnError >({ + url: "/ui/resources/{rid}/versions/{rvid}/latest", ...options, - url: "/ui/workflows/{wid}/versions/{git_commit_hash}", }); } /** - * Update status of workflow version - * Update the status of a workflow version. + * Delete resource version on cluster + * Delete the resource version on the cluster. * - * Permission `workflow:update_status` + * Permission `resource:delete_any` required. */ - public static workflowVersionUpdateWorkflowVersionStatus< + public static resourceVersionDeleteResourceVersionCluster< ThrowOnError extends boolean = true, >( - options: OptionsLegacyParser< - WorkflowVersionUpdateWorkflowVersionStatusData, + options: Options< + ResourceVersionDeleteResourceVersionClusterData, ThrowOnError >, ) { - return (options?.client ?? client).patch< - WorkflowVersionUpdateWorkflowVersionStatusResponse, - WorkflowVersionUpdateWorkflowVersionStatusError, + return (options.client ?? _heyApiClient).delete< + ResourceVersionDeleteResourceVersionClusterResponse, + ResourceVersionDeleteResourceVersionClusterError, ThrowOnError >({ + url: "/ui/resources/{rid}/versions/{rvid}/cluster", ...options, - url: "/ui/workflows/{wid}/versions/{git_commit_hash}/status", }); } /** - * Get metadata of workflow version - * Get the metadata of a workflow version. + * Delete resource version in S3 + * Delete the resource version in the S3 bucket. * - * Permission `workflow:read` required if the current user is the developer of the workflow, - * otherwise `workflow:read_any` + * Permission `resource:delete_any` required. */ - public static workflowVersionGetWorkflowVersionMetadata< + public static resourceVersionDeleteResourceVersionS3< ThrowOnError extends boolean = true, >( - options: OptionsLegacyParser< - WorkflowVersionGetWorkflowVersionMetadataData, - ThrowOnError - >, + options: Options<ResourceVersionDeleteResourceVersionS3Data, ThrowOnError>, ) { - return (options?.client ?? client).get< - WorkflowVersionGetWorkflowVersionMetadataResponse, - WorkflowVersionGetWorkflowVersionMetadataError, + return (options.client ?? _heyApiClient).delete< + ResourceVersionDeleteResourceVersionS3Response, + ResourceVersionDeleteResourceVersionS3Error, ThrowOnError >({ + url: "/ui/resources/{rid}/versions/{rvid}/s3", ...options, - url: "/ui/workflows/{wid}/versions/{git_commit_hash}/metadata", }); } +} +export class NewsService { /** - * Update metadata of workflow version - * Update the metadata of a workflow version. + * List news + * List all news events with filters. * - * Permission `workflow:update` required if the current user is the developer of the workflow, - * otherwise `workflow:update_any` + * This endpoint enforces keyset pagination. To iterate over all news, follow the link provided in the `Link` header. + * A missing `Link` header indicates that you iterated over all news with the current filters. + * + * Permission `news:list` required. */ - public static workflowVersionUpdateWorkflowVersionMetadata< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - WorkflowVersionUpdateWorkflowVersionMetadataData, - ThrowOnError - >, + public static newsListNews<ThrowOnError extends boolean = true>( + options?: Options<NewsListNewsData, ThrowOnError>, ) { - return (options?.client ?? client).put< - WorkflowVersionUpdateWorkflowVersionMetadataResponse, - WorkflowVersionUpdateWorkflowVersionMetadataError, + return (options?.client ?? _heyApiClient).get< + NewsListNewsResponse, + NewsListNewsError, ThrowOnError >({ + url: "/ui/news", ...options, - url: "/ui/workflows/{wid}/versions/{git_commit_hash}/metadata", }); } /** - * Deprecate a workflow version - * Deprecate a workflow version. + * Create news + * Create a news event. * - * Permission `workflow:update` required if you are the developer of the workflow, - * otherwise `workflow:update_status` + * Permission `news:create` required. */ - public static workflowVersionDeprecateWorkflowVersion< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - WorkflowVersionDeprecateWorkflowVersionData, - ThrowOnError - >, + public static newsCreateNews<ThrowOnError extends boolean = true>( + options: Options<NewsCreateNewsData, ThrowOnError>, ) { - return (options?.client ?? client).patch< - WorkflowVersionDeprecateWorkflowVersionResponse, - WorkflowVersionDeprecateWorkflowVersionError, + return (options.client ?? _heyApiClient).post< + NewsCreateNewsResponse, + NewsCreateNewsError, ThrowOnError >({ + url: "/ui/news", ...options, - url: "/ui/workflows/{wid}/versions/{git_commit_hash}/deprecate", + headers: { + "Content-Type": "application/json", + ...options?.headers, + }, }); } /** - * Update parameter extension of workflow version - * Update the parameter extension of a workflow version. + * Get latest news + * List the current news events. * - * Permission `workflow:update` required. + * Permission `news:list` required. */ - public static workflowVersionUpdateWorkflowVersionParameterExtension< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - WorkflowVersionUpdateWorkflowVersionParameterExtensionData, - ThrowOnError - >, + public static newsListLatestNews<ThrowOnError extends boolean = true>( + options?: Options<NewsListLatestNewsData, ThrowOnError>, ) { - return (options?.client ?? client).patch< - WorkflowVersionUpdateWorkflowVersionParameterExtensionResponse, - WorkflowVersionUpdateWorkflowVersionParameterExtensionError, + return (options?.client ?? _heyApiClient).get< + NewsListLatestNewsResponse, + unknown, ThrowOnError >({ + url: "/ui/news/latest", ...options, - url: "/ui/workflows/{wid}/versions/{git_commit_hash}/parameter-extension", }); } /** - * Fetch documentation for a workflow version - * Get the documentation for a specific workflow version. - * Streams the response directly from the right git repository. + * Delete a specific news + * Delete a specified news event. * - * Permission `workflow:read` required. + * Permission `news:delete` required. */ - public static workflowVersionDownloadWorkflowDocumentation< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - WorkflowVersionDownloadWorkflowDocumentationData, - ThrowOnError - >, + public static newsDeleteNews<ThrowOnError extends boolean = true>( + options: Options<NewsDeleteNewsData, ThrowOnError>, ) { - return (options?.client ?? client).get< - WorkflowVersionDownloadWorkflowDocumentationResponse, - WorkflowVersionDownloadWorkflowDocumentationError, + return (options.client ?? _heyApiClient).delete< + NewsDeleteNewsResponse, + NewsDeleteNewsError, ThrowOnError >({ + url: "/ui/news/{nid}", ...options, - url: "/ui/workflows/{wid}/versions/{git_commit_hash}/documentation", }); } /** - * Upload icon for workflow version - * Upload an icon for the workflow version and returns the new icon URL. + * Get a specific news + * Get a specified news event. * - * Permission `workflow:update` required. + * Permission `news:read` required. */ - public static workflowVersionUploadWorkflowVersionIcon< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - WorkflowVersionUploadWorkflowVersionIconData, - ThrowOnError - >, + public static newsGetNews<ThrowOnError extends boolean = true>( + options: Options<NewsGetNewsData, ThrowOnError>, ) { - return (options?.client ?? client).post< - WorkflowVersionUploadWorkflowVersionIconResponse, - WorkflowVersionUploadWorkflowVersionIconError, + return (options.client ?? _heyApiClient).get< + NewsGetNewsResponse, + NewsGetNewsError, ThrowOnError >({ + url: "/ui/news/{nid}", ...options, - ...formDataBodySerializer, - headers: { - "Content-Type": null, - ...options?.headers, - }, - url: "/ui/workflows/{wid}/versions/{git_commit_hash}/icon", }); } +} +export class PublicService { /** - * Delete icon of workflow version - * Delete the icon of the workflow version. - * - * Permission `workflow:update` required. + * Get available workflows + * Public route to fetch all available workflows. */ - public static workflowVersionDeleteWorkflowVersionIcon< - ThrowOnError extends boolean = true, - >( - options: OptionsLegacyParser< - WorkflowVersionDeleteWorkflowVersionIconData, - ThrowOnError - >, + public static publicGetPublicWorkflows<ThrowOnError extends boolean = true>( + options?: Options<PublicGetPublicWorkflowsData, ThrowOnError>, ) { - return (options?.client ?? client).delete< - WorkflowVersionDeleteWorkflowVersionIconResponse, - WorkflowVersionDeleteWorkflowVersionIconError, + return (options?.client ?? _heyApiClient).get< + PublicGetPublicWorkflowsResponse, + unknown, ThrowOnError >({ + url: "/ui/public/workflows", ...options, - url: "/ui/workflows/{wid}/versions/{git_commit_hash}/icon", }); } } diff --git a/src/client/transformers.gen.ts b/src/client/transformers.gen.ts new file mode 100644 index 0000000..a699533 --- /dev/null +++ b/src/client/transformers.gen.ts @@ -0,0 +1,21 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { ResourceVersionResourceFileTreeResponse } from "./types.gen"; + +const fileTreeSchemaResponseTransformer = (data: any) => { + if (data.contents) { + data.contents = data.contents.map((item: any) => { + return fileTreeSchemaResponseTransformer(item); + }); + } + return data; +}; + +export const resourceVersionResourceFileTreeResponseTransformer = async ( + data: any, +): Promise<ResourceVersionResourceFileTreeResponse> => { + data = data.map((item: any) => { + return fileTreeSchemaResponseTransformer(item); + }); + return data; +}; diff --git a/src/client/types.gen.ts b/src/client/types.gen.ts index 920f22a..a795751 100644 --- a/src/client/types.gen.ts +++ b/src/client/types.gen.ts @@ -116,14 +116,14 @@ export type ApiTokenPrivateOut = { token: string; }; -export type Body_Bucket_update_bucket_public_state = { +export type BodyBucketUpdateBucketPublicState = { /** * New public state */ public: boolean; }; -export type Body_Workflow_Version_upload_workflow_version_icon = { +export type BodyWorkflowVersionUploadWorkflowVersionIcon = { /** * Icon for the Workflow. */ @@ -343,13 +343,7 @@ export type FileTree = { size: number; }; -export enum type { - FILE = "file", - DIRECTORY = "directory", - LINK = "link", -} - -export type HTTPValidationError = { +export type HttpValidationError = { detail?: Array<ValidationError>; }; @@ -361,7 +355,7 @@ export type IconUpdateOut = { }; export type InstanceSpecificDefaultParameters = { - [key: string]: string | number | boolean; + [key: string]: string | number | number | boolean; }; export type NewsIn = { @@ -383,15 +377,6 @@ export type NewsIn = { category?: "workflow" | "resource" | "system"; }; -/** - * Category of the news event - */ -export enum category { - WORKFLOW = "workflow", - RESOURCE = "resource", - SYSTEM = "system", -} - export type NewsOut = { /** * Content of the news. Can contain Markdown. @@ -424,31 +409,36 @@ export type NewsOut = { }; export enum NextflowVersion { - _22_10_0 = "22.10.0", - _22_10_1 = "22.10.1", - _22_10_2 = "22.10.2", - _22_10_3 = "22.10.3", - _22_10_4 = "22.10.4", - _22_10_5 = "22.10.5", - _22_10_6 = "22.10.6", - _22_10_7 = "22.10.7", - _22_10_8 = "22.10.8", - _23_04_0 = "23.04.0", - _23_04_1 = "23.04.1", - _23_04_2 = "23.04.2", - _23_04_3 = "23.04.3", - _23_04_4 = "23.04.4", - _23_04_5 = "23.04.5", - _23_10_0 = "23.10.0", - _23_10_1 = "23.10.1", - _23_10_2 = "23.10.2", - _23_10_3 = "23.10.3", - _23_10_4 = "23.10.4", - _24_04_1 = "24.04.1", - _24_04_2 = "24.04.2", - _24_04_3 = "24.04.3", - _24_04_4 = "24.04.4", - _24_10_0 = "24.10.0", + "22_10_0" = "22.10.0", + "22_10_1" = "22.10.1", + "22_10_2" = "22.10.2", + "22_10_3" = "22.10.3", + "22_10_4" = "22.10.4", + "22_10_5" = "22.10.5", + "22_10_6" = "22.10.6", + "22_10_7" = "22.10.7", + "22_10_8" = "22.10.8", + "23_04_0" = "23.04.0", + "23_04_1" = "23.04.1", + "23_04_2" = "23.04.2", + "23_04_3" = "23.04.3", + "23_04_4" = "23.04.4", + "23_04_5" = "23.04.5", + "23_10_0" = "23.10.0", + "23_10_1" = "23.10.1", + "23_10_2" = "23.10.2", + "23_10_3" = "23.10.3", + "23_10_4" = "23.10.4", + "24_04_1" = "24.04.1", + "24_04_2" = "24.04.2", + "24_04_3" = "24.04.3", + "24_04_4" = "24.04.4", + "24_10_0" = "24.10.0", +} + +export enum OidcProvider { + LIFESCIENCE_AAI = "lifescience-aai", + NFDI_AAI = "nfdi-aai", } export type OwnershipTransferRequestIn = { @@ -503,13 +493,13 @@ export enum OwnershipTypeEnum { RESOURCE = "resource", } -export type ParameterExtension_Input = { +export type ParameterExtensionInput = { /** * The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key. */ mapping?: { [key: string]: { - [key: string]: string | number; + [key: string]: string | number | number; }; }; /** @@ -519,13 +509,13 @@ export type ParameterExtension_Input = { parameter_visibility?: ParameterVisibilityMapping; }; -export type ParameterExtension_Output = { +export type ParameterExtensionOutput = { /** * The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key. */ mapping?: { [key: string]: { - [key: string]: string | number; + [key: string]: string | number | number; }; }; /** @@ -591,7 +581,7 @@ export type PublicWorkflowOut = { /** * URL to the workflow icon */ - readonly icon_url: string | null; + icon_url: string | null; }; export type ResourceIn = { @@ -777,9 +767,13 @@ export type UserOutExtended = { */ uid: string; /** - * Lifesicence ID of the user + * Lifesicence AAI ID of the user */ lifescience_id?: string | null; + /** + * NFDI AAI ID of the user + */ + nfdi_id?: string | null; /** * Timestamp when the invitation token was created as UNIX timestamp */ @@ -1150,7 +1144,7 @@ export type WorkflowVersionOut = { /** * Parameter extension specific for this CloWM instance */ - parameter_extension?: ParameterExtension_Output | null; + parameter_extension?: ParameterExtensionOutput | null; /** * The version of Nextflow this workflow version requires. */ @@ -1174,444 +1168,679 @@ export type WorkflowVersionStatusSchema = { status: WorkflowVersionStatus; }; -export type ApiTokenListTokenData = { +export type AuthKickstartLoginData = { + body?: never; + path: { + /** + * The OIDC provider to use for login + */ + provider: OidcProvider; + }; query?: { /** - * UID of the user to filter for. Permission `api_token:list` required if current users is the target. + * Unique token to validate an invitation */ - uid?: string | null; + invitation_token?: string | null; + /** + * Will be appended to redirect response in the callback route as URL query parameter `next` + */ + next?: string | null; }; + url: "/auth/login/{provider}"; }; -export type ApiTokenListTokenResponse = Array<ApiTokenOut>; +export type AuthKickstartLoginErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type ApiTokenListTokenError = HTTPValidationError; +export type AuthKickstartLoginError = + AuthKickstartLoginErrors[keyof AuthKickstartLoginErrors]; -export type ApiTokenCreateTokenData = { - body: ApiTokenIn; +export type AuthLoginCallbackData = { + body?: never; + path: { + provider: OidcProvider; + }; + query?: never; + url: "/auth/login/callback/{provider}"; }; -export type ApiTokenCreateTokenResponse = ApiTokenPrivateOut; +export type AuthLoginCallbackErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type ApiTokenCreateTokenError = HTTPValidationError; +export type AuthLoginCallbackError = + AuthLoginCallbackErrors[keyof AuthLoginCallbackErrors]; -export type ApiTokenGetTokenData = { +export type AuthKickstartAccountConnectionData = { + body?: never; path: { /** - * ID of an API token + * The OIDC provider to use for login */ - tid: string; + provider: OidcProvider; }; + query?: never; + url: "/auth/account/connect/{provider}"; }; -export type ApiTokenGetTokenResponse = ApiTokenOut; +export type AuthKickstartAccountConnectionErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type ApiTokenGetTokenError = HTTPValidationError; +export type AuthKickstartAccountConnectionError = + AuthKickstartAccountConnectionErrors[keyof AuthKickstartAccountConnectionErrors]; -export type ApiTokenDeleteTokenData = { +export type AuthAccountConnectionCallbackData = { + body?: never; path: { - /** - * ID of an API token - */ - tid: string; + provider: OidcProvider; }; + query?: never; + url: "/auth/account/callback/{provider}"; +}; + +export type AuthAccountConnectionCallbackErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; }; -export type ApiTokenDeleteTokenResponse = void; +export type AuthAccountConnectionCallbackError = + AuthAccountConnectionCallbackErrors[keyof AuthAccountConnectionCallbackErrors]; -export type ApiTokenDeleteTokenError = HTTPValidationError; +export type AuthLogoutData = { + body?: never; + path?: never; + query?: never; + url: "/auth/logout"; +}; -export type BucketListBucketsData = { +export type ApiTokenListTokenData = { + body?: never; + path?: never; query?: { /** - * Type of the bucket to get. Ignored when `user` parameter not set - */ - bucket_type?: BucketType; - /** - * UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target. + * UID of the user to filter for. Permission `api_token:list` required if current users is the target. */ - owner_id?: string | null; + uid?: string | null; }; + url: "/ui/tokens"; }; -export type BucketListBucketsResponse = Array<BucketOut>; +export type ApiTokenListTokenErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type BucketListBucketsError = HTTPValidationError; +export type ApiTokenListTokenError = + ApiTokenListTokenErrors[keyof ApiTokenListTokenErrors]; -export type BucketCreateBucketData = { - body: BucketIn; +export type ApiTokenListTokenResponses = { + /** + * Successful Response + */ + 200: Array<ApiTokenOut>; }; -export type BucketCreateBucketResponse = BucketOut; +export type ApiTokenListTokenResponse = + ApiTokenListTokenResponses[keyof ApiTokenListTokenResponses]; -export type BucketCreateBucketError = HTTPValidationError; +export type ApiTokenCreateTokenData = { + /** + * Meta-data for Api token to create + */ + body: ApiTokenIn; + path?: never; + query?: never; + url: "/ui/tokens"; +}; -export type BucketListBucketOtrsData = { - query?: { - /** - * UID of user who is the current owner. - */ - current_owner_id?: string | null; - /** - * UID of user who will be the new owner. - */ - new_owner_id?: string | null; - }; +export type ApiTokenCreateTokenErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; }; -export type BucketListBucketOtrsResponse = Array<OwnershipTransferRequestOut>; +export type ApiTokenCreateTokenError = + ApiTokenCreateTokenErrors[keyof ApiTokenCreateTokenErrors]; + +export type ApiTokenCreateTokenResponses = { + /** + * Successful Response + */ + 201: ApiTokenPrivateOut; +}; -export type BucketListBucketOtrsError = HTTPValidationError; +export type ApiTokenCreateTokenResponse = + ApiTokenCreateTokenResponses[keyof ApiTokenCreateTokenResponses]; -export type BucketGetBucketData = { +export type ApiTokenDeleteTokenData = { + body?: never; path: { /** - * Name of a bucket + * ID of an API token */ - bucket_name: string; + tid: string; }; + query?: never; + url: "/ui/tokens/{tid}"; }; -export type BucketGetBucketResponse = BucketOut; +export type ApiTokenDeleteTokenErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type BucketGetBucketError = HTTPValidationError; +export type ApiTokenDeleteTokenError = + ApiTokenDeleteTokenErrors[keyof ApiTokenDeleteTokenErrors]; -export type BucketDeleteBucketData = { +export type ApiTokenDeleteTokenResponses = { + /** + * Successful Response + */ + 204: void; +}; + +export type ApiTokenDeleteTokenResponse = + ApiTokenDeleteTokenResponses[keyof ApiTokenDeleteTokenResponses]; + +export type ApiTokenGetTokenData = { + body?: never; path: { /** - * Name of a bucket + * ID of an API token */ - bucket_name: string; + tid: string; }; + query?: never; + url: "/ui/tokens/{tid}"; +}; + +export type ApiTokenGetTokenErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type ApiTokenGetTokenError = + ApiTokenGetTokenErrors[keyof ApiTokenGetTokenErrors]; + +export type ApiTokenGetTokenResponses = { + /** + * Successful Response + */ + 200: ApiTokenOut; +}; + +export type ApiTokenGetTokenResponse = + ApiTokenGetTokenResponses[keyof ApiTokenGetTokenResponses]; + +export type UserListUsersData = { + body?: never; + path?: never; query?: { /** - * Delete even non-empty bucket + * Filter users by a substring in their name. */ - force_delete?: boolean; + name_substring?: string | null; + /** + * Filter users by their role. If multiple are selected, they are concatenating by an OR Expression. + */ + filter_roles?: Array<RoleEnum> | null; }; + url: "/ui/users"; }; -export type BucketDeleteBucketResponse = void; +export type UserListUsersErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type BucketDeleteBucketError = HTTPValidationError; +export type UserListUsersError = UserListUsersErrors[keyof UserListUsersErrors]; -export type BucketGetBucketOtrData = { - path: { - /** - * Name of a bucket - */ - bucket_name: string; - }; +export type UserListUsersResponses = { + /** + * Successful Response + */ + 200: Array<UserOutExtended>; }; -export type BucketGetBucketOtrResponse = OwnershipTransferRequestOut; +export type UserListUsersResponse = + UserListUsersResponses[keyof UserListUsersResponses]; -export type BucketGetBucketOtrError = HTTPValidationError; +export type UserCreateUserData = { + /** + * Meta-data for user to create + */ + body: UserIn; + path?: never; + query?: never; + url: "/ui/users"; +}; -export type BucketCreateBucketOtrData = { - body: OwnershipTransferRequestIn; - path: { - /** - * Name of a bucket - */ - bucket_name: string; - }; +export type UserCreateUserErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; }; -export type BucketCreateBucketOtrResponse = OwnershipTransferRequestOut; +export type UserCreateUserError = + UserCreateUserErrors[keyof UserCreateUserErrors]; + +export type UserCreateUserResponses = { + /** + * Successful Response + */ + 201: UserOutExtended; +}; -export type BucketCreateBucketOtrError = HTTPValidationError; +export type UserCreateUserResponse = + UserCreateUserResponses[keyof UserCreateUserResponses]; -export type BucketAcceptBucketOtrData = { - path: { +export type UserSearchUsersData = { + body?: never; + path?: never; + query: { /** - * Name of a bucket + * Filter users by a substring in their name. */ - bucket_name: string; + name_substring: string; }; + url: "/ui/users/search"; }; -export type BucketAcceptBucketOtrResponse = BucketOut; +export type UserSearchUsersErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type BucketAcceptBucketOtrError = HTTPValidationError; +export type UserSearchUsersError = + UserSearchUsersErrors[keyof UserSearchUsersErrors]; -export type BucketDeleteBucketOtrData = { - path: { - /** - * Name of a bucket - */ - bucket_name: string; - }; +export type UserSearchUsersResponses = { + /** + * Successful Response + */ + 200: Array<UserOut>; }; -export type BucketDeleteBucketOtrResponse = void; +export type UserSearchUsersResponse = + UserSearchUsersResponses[keyof UserSearchUsersResponses]; -export type BucketDeleteBucketOtrError = HTTPValidationError; +export type UserGetLoggedInUserData = { + body?: never; + path?: never; + query?: never; + url: "/ui/users/me"; +}; -export type BucketUpdateBucketPublicStateData = { - body: Body_Bucket_update_bucket_public_state; +export type UserGetLoggedInUserResponses = { + /** + * Successful Response + */ + 200: UserOutExtended; +}; + +export type UserGetLoggedInUserResponse = + UserGetLoggedInUserResponses[keyof UserGetLoggedInUserResponses]; + +export type UserDeleteUserData = { + body?: never; path: { /** - * Name of a bucket + * UID of a user */ - bucket_name: string; + uid: string; }; + query?: never; + url: "/ui/users/{uid}"; +}; + +export type UserDeleteUserErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; }; -export type BucketUpdateBucketPublicStateResponse = BucketOut; +export type UserDeleteUserError = + UserDeleteUserErrors[keyof UserDeleteUserErrors]; + +export type UserDeleteUserResponses = { + /** + * Successful Response + */ + 204: void; +}; -export type BucketUpdateBucketPublicStateError = HTTPValidationError; +export type UserDeleteUserResponse = + UserDeleteUserResponses[keyof UserDeleteUserResponses]; -export type BucketUpdateBucketLimitsData = { - body: BucketSizeLimits; +export type UserGetUserData = { + body?: never; path: { /** - * Name of a bucket + * UID of a user */ - bucket_name: string; + uid: string; }; + query?: never; + url: "/ui/users/{uid}"; }; -export type BucketUpdateBucketLimitsResponse = BucketOut; +export type UserGetUserErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type BucketUpdateBucketLimitsError = HTTPValidationError; +export type UserGetUserError = UserGetUserErrors[keyof UserGetUserErrors]; -export type BucketPermissionListPermissionsData = { - query?: { - /** - * Scopes of Bucket Permissions to fetch - */ - permission_scopes?: Array<"read" | "write"> | null; +export type UserGetUserResponses = { + /** + * Successful Response + */ + 200: UserOut; +}; + +export type UserGetUserResponse = + UserGetUserResponses[keyof UserGetUserResponses]; + +export type UserUpdateRolesData = { + /** + * The new roles of the user + */ + body: UserRoles; + path: { /** - * Status of Bucket Permissions to fetch + * UID of a user */ - permission_status?: PermissionStatus | null; + uid: string; }; + query?: never; + url: "/ui/users/{uid}/roles"; }; -export type BucketPermissionListPermissionsResponse = - Array<BucketPermissionOut>; +export type UserUpdateRolesErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type BucketPermissionListPermissionsError = HTTPValidationError; +export type UserUpdateRolesError = + UserUpdateRolesErrors[keyof UserUpdateRolesErrors]; -export type BucketPermissionCreatePermissionData = { - body: BucketPermissionIn; +export type UserUpdateRolesResponses = { + /** + * Successful Response + */ + 200: UserOutExtended; }; -export type BucketPermissionCreatePermissionResponse = BucketPermissionOut; - -export type BucketPermissionCreatePermissionError = HTTPValidationError; +export type UserUpdateRolesResponse = + UserUpdateRolesResponses[keyof UserUpdateRolesResponses]; -export type BucketPermissionListPermissionsPerUserData = { +export type UserResendInvitationData = { + body?: never; path: { /** * UID of a user */ uid: string; }; - query?: { - /** - * Scopes of Bucket Permissions to fetch - */ - permission_scopes?: Array<"read" | "write"> | null; - /** - * Status of Bucket Permissions to fetch - */ - permission_status?: PermissionStatus | null; - }; + query?: never; + url: "/ui/users/{uid}/invitation"; }; -export type BucketPermissionListPermissionsPerUserResponse = - Array<BucketPermissionOut>; +export type UserResendInvitationErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type BucketPermissionListPermissionsPerUserError = HTTPValidationError; +export type UserResendInvitationError = + UserResendInvitationErrors[keyof UserResendInvitationErrors]; -export type BucketPermissionListPermissionsPerBucketData = { - path: { - /** - * Name of a bucket - */ - bucket_name: string; - }; - query?: { - /** - * Scopes of Bucket Permissions to fetch - */ - permission_scopes?: Array<"read" | "write"> | null; - /** - * Status of Bucket Permissions to fetch - */ - permission_status?: PermissionStatus | null; - }; +export type UserResendInvitationResponses = { + /** + * Successful Response + */ + 200: UserOutExtended; }; -export type BucketPermissionListPermissionsPerBucketResponse = - Array<BucketPermissionOut>; - -export type BucketPermissionListPermissionsPerBucketError = HTTPValidationError; +export type UserResendInvitationResponse = + UserResendInvitationResponses[keyof UserResendInvitationResponses]; -export type BucketPermissionGetPermissionData = { +export type S3KeyGetUserKeysData = { + body?: never; path: { - /** - * Name of a bucket - */ - bucket_name: string; /** * UID of a user */ uid: string; }; + query?: never; + url: "/ui/users/{uid}/keys"; +}; + +export type S3KeyGetUserKeysErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; }; -export type BucketPermissionGetPermissionResponse = BucketPermissionOut; +export type S3KeyGetUserKeysError = + S3KeyGetUserKeysErrors[keyof S3KeyGetUserKeysErrors]; -export type BucketPermissionGetPermissionError = HTTPValidationError; +export type S3KeyGetUserKeysResponses = { + /** + * Successful Response + */ + 200: Array<S3Key>; +}; -export type BucketPermissionUpdatePermissionData = { - body: BucketPermissionParameters; +export type S3KeyGetUserKeysResponse = + S3KeyGetUserKeysResponses[keyof S3KeyGetUserKeysResponses]; + +export type S3KeyCreateUserKeyData = { + body?: never; path: { - /** - * Name of a bucket - */ - bucket_name: string; /** * UID of a user */ uid: string; }; + query?: never; + url: "/ui/users/{uid}/keys"; +}; + +export type S3KeyCreateUserKeyErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; }; -export type BucketPermissionUpdatePermissionResponse = BucketPermissionOut; +export type S3KeyCreateUserKeyError = + S3KeyCreateUserKeyErrors[keyof S3KeyCreateUserKeyErrors]; + +export type S3KeyCreateUserKeyResponses = { + /** + * Successful Response + */ + 201: S3Key; +}; -export type BucketPermissionUpdatePermissionError = HTTPValidationError; +export type S3KeyCreateUserKeyResponse = + S3KeyCreateUserKeyResponses[keyof S3KeyCreateUserKeyResponses]; -export type BucketPermissionDeletePermissionData = { +export type S3KeyDeleteUserKeyData = { + body?: never; path: { /** - * Name of a bucket + * ID of the S3 access key */ - bucket_name: string; + access_id: string; /** * UID of a user */ uid: string; }; + query?: never; + url: "/ui/users/{uid}/keys/{access_id}"; }; -export type BucketPermissionDeletePermissionResponse = void; +export type S3KeyDeleteUserKeyErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type BucketPermissionDeletePermissionError = HTTPValidationError; +export type S3KeyDeleteUserKeyError = + S3KeyDeleteUserKeyErrors[keyof S3KeyDeleteUserKeyErrors]; -export type NewsCreateNewsData = { - body: NewsIn; +export type S3KeyDeleteUserKeyResponses = { + /** + * Successful Response + */ + 204: void; }; -export type NewsCreateNewsResponse = NewsOut; - -export type NewsCreateNewsError = HTTPValidationError; +export type S3KeyDeleteUserKeyResponse = + S3KeyDeleteUserKeyResponses[keyof S3KeyDeleteUserKeyResponses]; -export type NewsListNewsData = { - query?: { - /** - * Filter for news that are created after this UNIX timestamp - */ - created_after?: number | null; - /** - * Filter for news created by a specific user - */ - creator_id?: string | null; - /** - * Id of the item to start the query from. DO NOT SET MANUALLY. - */ - id_after?: string | null; +export type S3KeyGetUserKeyData = { + body?: never; + path: { /** - * Number of items to list per page + * ID of the S3 access key */ - per_page?: number; + access_id: string; /** - * Sort order of items with creation time + * UID of a user */ - sort?: "asc" | "desc"; + uid: string; }; + query?: never; + url: "/ui/users/{uid}/keys/{access_id}"; }; -export type NewsListNewsResponse = Array<NewsOut>; +export type S3KeyGetUserKeyErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type NewsListNewsError = HTTPValidationError; +export type S3KeyGetUserKeyError = + S3KeyGetUserKeyErrors[keyof S3KeyGetUserKeyErrors]; -export type NewsListLatestNewsResponse = Array<NewsOut>; +export type S3KeyGetUserKeyResponses = { + /** + * Successful Response + */ + 200: S3Key; +}; -export type NewsListLatestNewsError = unknown; +export type S3KeyGetUserKeyResponse = + S3KeyGetUserKeyResponses[keyof S3KeyGetUserKeyResponses]; -export type NewsGetNewsData = { - path: { +export type BucketListBucketsData = { + body?: never; + path?: never; + query?: { /** - * ID of a news event + * UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target. */ - nid: string; - }; -}; - -export type NewsGetNewsResponse = NewsOut; - -export type NewsGetNewsError = HTTPValidationError; - -export type NewsDeleteNewsData = { - path: { + owner_id?: string | null; /** - * ID of a news event + * Type of the bucket to get. Ignored when `user` parameter not set */ - nid: string; + bucket_type?: BucketType; }; + url: "/ui/buckets"; }; -export type NewsDeleteNewsResponse = void; - -export type NewsDeleteNewsError = HTTPValidationError; - -export type PublicGetPublicWorkflowsResponse = Array<PublicWorkflowOut>; +export type BucketListBucketsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type PublicGetPublicWorkflowsError = unknown; +export type BucketListBucketsError = + BucketListBucketsErrors[keyof BucketListBucketsErrors]; -export type ResourceCreateResourceData = { - body: ResourceIn; +export type BucketListBucketsResponses = { + /** + * Successful Response + */ + 200: Array<BucketOut>; }; -export type ResourceCreateResourceResponse = ResourceOut; +export type BucketListBucketsResponse = + BucketListBucketsResponses[keyof BucketListBucketsResponses]; -export type ResourceCreateResourceError = HTTPValidationError; - -export type ResourceListResourcesData = { - query?: { - /** - * Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`. - */ - maintainer_id?: string | null; - /** - * Filter resources by a substring in their name. - */ - name_substring?: string | null; - /** - * Filter resources to by the public flag - */ - public?: boolean | null; - /** - * Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required. - */ - version_status?: Array<ResourceVersionStatus> | null; - }; +export type BucketCreateBucketData = { + /** + * Meta-data for bucket to create + */ + body: BucketIn; + path?: never; + query?: never; + url: "/ui/buckets"; }; -export type ResourceListResourcesResponse = Array<ResourceOut>; +export type BucketCreateBucketErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type ResourceListResourcesError = HTTPValidationError; +export type BucketCreateBucketError = + BucketCreateBucketErrors[keyof BucketCreateBucketErrors]; -export type ResourceListSyncRequestsResponse = - Array<UserSynchronizationRequestOut>; +export type BucketCreateBucketResponses = { + /** + * Successful Response + */ + 201: BucketOut; +}; -export type ResourceListSyncRequestsError = unknown; +export type BucketCreateBucketResponse = + BucketCreateBucketResponses[keyof BucketCreateBucketResponses]; -export type ResourceListResourceOtrsData = { +export type BucketListBucketOtrsData = { + body?: never; + path?: never; query?: { /** * UID of user who is the current owner. @@ -1622,466 +1851,628 @@ export type ResourceListResourceOtrsData = { */ new_owner_id?: string | null; }; + url: "/ui/buckets/ownership_transfer_request"; }; -export type ResourceListResourceOtrsResponse = - Array<OwnershipTransferRequestOut>; +export type BucketListBucketOtrsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type ResourceListResourceOtrsError = HTTPValidationError; +export type BucketListBucketOtrsError = + BucketListBucketOtrsErrors[keyof BucketListBucketOtrsErrors]; -export type ResourceGetResourceData = { +export type BucketListBucketOtrsResponses = { + /** + * Successful Response + */ + 200: Array<OwnershipTransferRequestOut>; +}; + +export type BucketListBucketOtrsResponse = + BucketListBucketOtrsResponses[keyof BucketListBucketOtrsResponses]; + +export type BucketDeleteBucketData = { + body?: never; path: { /** - * ID of a resource + * Name of a bucket */ - rid: string; + bucket_name: string; }; query?: { /** - * Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required. + * Delete even non-empty bucket */ - version_status?: Array<ResourceVersionStatus> | null; + force_delete?: boolean; }; + url: "/ui/buckets/{bucket_name}"; }; -export type ResourceGetResourceResponse = ResourceOut; +export type BucketDeleteBucketErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type ResourceGetResourceError = HTTPValidationError; +export type BucketDeleteBucketError = + BucketDeleteBucketErrors[keyof BucketDeleteBucketErrors]; -export type ResourceDeleteResourceData = { +export type BucketDeleteBucketResponses = { + /** + * Successful Response + */ + 204: void; +}; + +export type BucketDeleteBucketResponse = + BucketDeleteBucketResponses[keyof BucketDeleteBucketResponses]; + +export type BucketGetBucketData = { + body?: never; path: { /** - * ID of a resource + * Name of a bucket */ - rid: string; + bucket_name: string; }; + query?: never; + url: "/ui/buckets/{bucket_name}"; }; -export type ResourceDeleteResourceResponse = void; +export type BucketGetBucketErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type ResourceDeleteResourceError = HTTPValidationError; +export type BucketGetBucketError = + BucketGetBucketErrors[keyof BucketGetBucketErrors]; -export type ResourceGetResourceOtrData = { +export type BucketGetBucketResponses = { + /** + * Successful Response + */ + 200: BucketOut; +}; + +export type BucketGetBucketResponse = + BucketGetBucketResponses[keyof BucketGetBucketResponses]; + +export type BucketDeleteBucketOtrData = { + body?: never; path: { /** - * ID of a resource + * Name of a bucket */ - rid: string; + bucket_name: string; }; + query?: never; + url: "/ui/buckets/{bucket_name}/ownership_transfer_request"; +}; + +export type BucketDeleteBucketOtrErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; }; -export type ResourceGetResourceOtrResponse = OwnershipTransferRequestOut; +export type BucketDeleteBucketOtrError = + BucketDeleteBucketOtrErrors[keyof BucketDeleteBucketOtrErrors]; + +export type BucketDeleteBucketOtrResponses = { + /** + * Successful Response + */ + 204: void; +}; -export type ResourceGetResourceOtrError = HTTPValidationError; +export type BucketDeleteBucketOtrResponse = + BucketDeleteBucketOtrResponses[keyof BucketDeleteBucketOtrResponses]; -export type ResourceCreateResourceOtrData = { - body: OwnershipTransferRequestIn; +export type BucketGetBucketOtrData = { + body?: never; path: { /** - * ID of a resource + * Name of a bucket */ - rid: string; + bucket_name: string; }; + query?: never; + url: "/ui/buckets/{bucket_name}/ownership_transfer_request"; +}; + +export type BucketGetBucketOtrErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; }; -export type ResourceCreateResourceOtrResponse = OwnershipTransferRequestOut; +export type BucketGetBucketOtrError = + BucketGetBucketOtrErrors[keyof BucketGetBucketOtrErrors]; + +export type BucketGetBucketOtrResponses = { + /** + * Successful Response + */ + 200: OwnershipTransferRequestOut; +}; -export type ResourceCreateResourceOtrError = HTTPValidationError; +export type BucketGetBucketOtrResponse = + BucketGetBucketOtrResponses[keyof BucketGetBucketOtrResponses]; -export type ResourceAcceptResourceOtrData = { +export type BucketAcceptBucketOtrData = { + body?: never; path: { /** - * ID of a resource + * Name of a bucket */ - rid: string; + bucket_name: string; }; + query?: never; + url: "/ui/buckets/{bucket_name}/ownership_transfer_request"; }; -export type ResourceAcceptResourceOtrResponse = ResourceOut; +export type BucketAcceptBucketOtrErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type ResourceAcceptResourceOtrError = HTTPValidationError; +export type BucketAcceptBucketOtrError = + BucketAcceptBucketOtrErrors[keyof BucketAcceptBucketOtrErrors]; -export type ResourceDeleteResourceOtrData = { +export type BucketAcceptBucketOtrResponses = { + /** + * Successful Response + */ + 200: BucketOut; +}; + +export type BucketAcceptBucketOtrResponse = + BucketAcceptBucketOtrResponses[keyof BucketAcceptBucketOtrResponses]; + +export type BucketCreateBucketOtrData = { + /** + * Meta-data for the bucket OTR to create + */ + body: OwnershipTransferRequestIn; path: { /** - * ID of a resource + * Name of a bucket */ - rid: string; + bucket_name: string; }; + query?: never; + url: "/ui/buckets/{bucket_name}/ownership_transfer_request"; }; -export type ResourceDeleteResourceOtrResponse = void; +export type BucketCreateBucketOtrErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type ResourceDeleteResourceOtrError = HTTPValidationError; +export type BucketCreateBucketOtrError = + BucketCreateBucketOtrErrors[keyof BucketCreateBucketOtrErrors]; -export type ResourceVersionListResourceVersionsData = { +export type BucketCreateBucketOtrResponses = { + /** + * Successful Response + */ + 201: OwnershipTransferRequestOut; +}; + +export type BucketCreateBucketOtrResponse = + BucketCreateBucketOtrResponses[keyof BucketCreateBucketOtrResponses]; + +export type BucketUpdateBucketPublicStateData = { + body: BodyBucketUpdateBucketPublicState; path: { /** - * ID of a resource + * Name of a bucket */ - rid: string; - }; - query?: { - /** - * Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required. - */ - version_status?: Array<ResourceVersionStatus> | null; + bucket_name: string; }; + query?: never; + url: "/ui/buckets/{bucket_name}/public"; }; -export type ResourceVersionListResourceVersionsResponse = - Array<ResourceVersionOut>; +export type BucketUpdateBucketPublicStateErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type ResourceVersionListResourceVersionsError = HTTPValidationError; +export type BucketUpdateBucketPublicStateError = + BucketUpdateBucketPublicStateErrors[keyof BucketUpdateBucketPublicStateErrors]; -export type ResourceVersionRequestResourceVersionData = { - body: ResourceVersionIn; - path: { - /** - * ID of a resource - */ - rid: string; - }; +export type BucketUpdateBucketPublicStateResponses = { + /** + * Successful Response + */ + 200: BucketOut; }; -export type ResourceVersionRequestResourceVersionResponse = ResourceVersionOut; +export type BucketUpdateBucketPublicStateResponse = + BucketUpdateBucketPublicStateResponses[keyof BucketUpdateBucketPublicStateResponses]; -export type ResourceVersionRequestResourceVersionError = HTTPValidationError; - -export type ResourceVersionGetResourceVersionData = { +export type BucketUpdateBucketLimitsData = { + /** + * New size limits for bucket + */ + body: BucketSizeLimits; path: { /** - * ID of a resource - */ - rid: string; - /** - * ID of a resource version + * Name of a bucket */ - rvid: string; + bucket_name: string; }; + query?: never; + url: "/ui/buckets/{bucket_name}/limits"; }; -export type ResourceVersionGetResourceVersionResponse = ResourceVersionOut; +export type BucketUpdateBucketLimitsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type ResourceVersionGetResourceVersionError = HTTPValidationError; +export type BucketUpdateBucketLimitsError = + BucketUpdateBucketLimitsErrors[keyof BucketUpdateBucketLimitsErrors]; -export type ResourceVersionResourceFileTreeData = { - path: { - /** - * ID of a resource - */ - rid: string; - /** - * ID of a resource version - */ - rvid: string; - }; +export type BucketUpdateBucketLimitsResponses = { + /** + * Successful Response + */ + 200: BucketOut; }; -export type ResourceVersionResourceFileTreeResponse = Array<FileTree>; +export type BucketUpdateBucketLimitsResponse = + BucketUpdateBucketLimitsResponses[keyof BucketUpdateBucketLimitsResponses]; -export type ResourceVersionResourceFileTreeError = HTTPValidationError; - -export type ResourceVersionRequestResourceVersionReviewData = { - path: { +export type BucketPermissionListPermissionsData = { + body?: never; + path?: never; + query?: { /** - * ID of a resource + * Scopes of Bucket Permissions to fetch */ - rid: string; + permission_scopes?: Array<"read" | "write"> | null; /** - * ID of a resource version + * Status of Bucket Permissions to fetch */ - rvid: string; + permission_status?: PermissionStatus | null; }; + url: "/ui/permissions"; }; -export type ResourceVersionRequestResourceVersionReviewResponse = - ResourceVersionOut; +export type BucketPermissionListPermissionsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type ResourceVersionRequestResourceVersionReviewError = - HTTPValidationError; +export type BucketPermissionListPermissionsError = + BucketPermissionListPermissionsErrors[keyof BucketPermissionListPermissionsErrors]; -export type ResourceVersionRequestResourceVersionSyncData = { - body: UserSynchronizationRequestIn; - path: { - /** - * ID of a resource - */ - rid: string; - /** - * ID of a resource version - */ - rvid: string; - }; +export type BucketPermissionListPermissionsResponses = { + /** + * Successful Response + */ + 200: Array<BucketPermissionOut>; }; -export type ResourceVersionRequestResourceVersionSyncResponse = - ResourceVersionOut; +export type BucketPermissionListPermissionsResponse = + BucketPermissionListPermissionsResponses[keyof BucketPermissionListPermissionsResponses]; -export type ResourceVersionRequestResourceVersionSyncError = - HTTPValidationError; +export type BucketPermissionCreatePermissionData = { + /** + * Permission to create + */ + body: BucketPermissionIn; + path?: never; + query?: never; + url: "/ui/permissions"; +}; -export type ResourceVersionResourceVersionReviewData = { - body: UserRequestAnswer; - path: { - /** - * ID of a resource - */ - rid: string; - /** - * ID of a resource version - */ - rvid: string; - }; +export type BucketPermissionCreatePermissionErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; }; -export type ResourceVersionResourceVersionReviewResponse = ResourceVersionOut; +export type BucketPermissionCreatePermissionError = + BucketPermissionCreatePermissionErrors[keyof BucketPermissionCreatePermissionErrors]; + +export type BucketPermissionCreatePermissionResponses = { + /** + * Successful Response + */ + 201: BucketPermissionOut; +}; -export type ResourceVersionResourceVersionReviewError = HTTPValidationError; +export type BucketPermissionCreatePermissionResponse = + BucketPermissionCreatePermissionResponses[keyof BucketPermissionCreatePermissionResponses]; -export type ResourceVersionResourceVersionSyncData = { - body: UserRequestAnswer; +export type BucketPermissionListPermissionsPerUserData = { + body?: never; path: { /** - * ID of a resource - */ - rid: string; - /** - * ID of a resource version + * UID of a user */ - rvid: string; + uid: string; }; -}; - -export type ResourceVersionResourceVersionSyncResponse = ResourceVersionOut; - -export type ResourceVersionResourceVersionSyncError = HTTPValidationError; - -export type ResourceVersionResourceVersionLatestData = { - path: { + query?: { /** - * ID of a resource + * Scopes of Bucket Permissions to fetch */ - rid: string; + permission_scopes?: Array<"read" | "write"> | null; /** - * ID of a resource version + * Status of Bucket Permissions to fetch */ - rvid: string; + permission_status?: PermissionStatus | null; }; + url: "/ui/permissions/user/{uid}"; }; -export type ResourceVersionResourceVersionLatestResponse = ResourceVersionOut; +export type BucketPermissionListPermissionsPerUserErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type ResourceVersionResourceVersionLatestError = HTTPValidationError; +export type BucketPermissionListPermissionsPerUserError = + BucketPermissionListPermissionsPerUserErrors[keyof BucketPermissionListPermissionsPerUserErrors]; -export type ResourceVersionDeleteResourceVersionClusterData = { - path: { - /** - * ID of a resource - */ - rid: string; - /** - * ID of a resource version - */ - rvid: string; - }; +export type BucketPermissionListPermissionsPerUserResponses = { + /** + * Successful Response + */ + 200: Array<BucketPermissionOut>; }; -export type ResourceVersionDeleteResourceVersionClusterResponse = - ResourceVersionOut; - -export type ResourceVersionDeleteResourceVersionClusterError = - HTTPValidationError; +export type BucketPermissionListPermissionsPerUserResponse = + BucketPermissionListPermissionsPerUserResponses[keyof BucketPermissionListPermissionsPerUserResponses]; -export type ResourceVersionDeleteResourceVersionS3Data = { +export type BucketPermissionListPermissionsPerBucketData = { + body?: never; path: { /** - * ID of a resource + * Name of a bucket */ - rid: string; + bucket_name: string; + }; + query?: { /** - * ID of a resource version + * Scopes of Bucket Permissions to fetch */ - rvid: string; + permission_scopes?: Array<"read" | "write"> | null; + /** + * Status of Bucket Permissions to fetch + */ + permission_status?: PermissionStatus | null; }; + url: "/ui/permissions/bucket/{bucket_name}"; }; -export type ResourceVersionDeleteResourceVersionS3Response = ResourceVersionOut; +export type BucketPermissionListPermissionsPerBucketErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type ResourceVersionDeleteResourceVersionS3Error = HTTPValidationError; +export type BucketPermissionListPermissionsPerBucketError = + BucketPermissionListPermissionsPerBucketErrors[keyof BucketPermissionListPermissionsPerBucketErrors]; -export type S3KeyGetUserKeysData = { - path: { - /** - * UID of a user - */ - uid: string; - }; +export type BucketPermissionListPermissionsPerBucketResponses = { + /** + * Successful Response + */ + 200: Array<BucketPermissionOut>; }; -export type S3KeyGetUserKeysResponse = Array<S3Key>; - -export type S3KeyGetUserKeysError = HTTPValidationError; +export type BucketPermissionListPermissionsPerBucketResponse = + BucketPermissionListPermissionsPerBucketResponses[keyof BucketPermissionListPermissionsPerBucketResponses]; -export type S3KeyCreateUserKeyData = { +export type BucketPermissionDeletePermissionData = { + body?: never; path: { + /** + * Name of a bucket + */ + bucket_name: string; /** * UID of a user */ uid: string; }; + query?: never; + url: "/ui/permissions/bucket/{bucket_name}/user/{uid}"; }; -export type S3KeyCreateUserKeyResponse = S3Key; +export type BucketPermissionDeletePermissionErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type S3KeyCreateUserKeyError = HTTPValidationError; +export type BucketPermissionDeletePermissionError = + BucketPermissionDeletePermissionErrors[keyof BucketPermissionDeletePermissionErrors]; -export type S3KeyGetUserKeyData = { +export type BucketPermissionDeletePermissionResponses = { + /** + * Successful Response + */ + 204: void; +}; + +export type BucketPermissionDeletePermissionResponse = + BucketPermissionDeletePermissionResponses[keyof BucketPermissionDeletePermissionResponses]; + +export type BucketPermissionGetPermissionData = { + body?: never; path: { /** - * ID of the S3 access key + * Name of a bucket */ - access_id: string; + bucket_name: string; /** * UID of a user */ uid: string; }; + query?: never; + url: "/ui/permissions/bucket/{bucket_name}/user/{uid}"; +}; + +export type BucketPermissionGetPermissionErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; }; -export type S3KeyGetUserKeyResponse = S3Key; +export type BucketPermissionGetPermissionError = + BucketPermissionGetPermissionErrors[keyof BucketPermissionGetPermissionErrors]; + +export type BucketPermissionGetPermissionResponses = { + /** + * Successful Response + */ + 200: BucketPermissionOut; +}; -export type S3KeyGetUserKeyError = HTTPValidationError; +export type BucketPermissionGetPermissionResponse = + BucketPermissionGetPermissionResponses[keyof BucketPermissionGetPermissionResponses]; -export type S3KeyDeleteUserKeyData = { +export type BucketPermissionUpdatePermissionData = { + /** + * Permission to create + */ + body: BucketPermissionParameters; path: { /** - * ID of the S3 access key + * Name of a bucket */ - access_id: string; + bucket_name: string; /** * UID of a user */ uid: string; }; + query?: never; + url: "/ui/permissions/bucket/{bucket_name}/user/{uid}"; }; -export type S3KeyDeleteUserKeyResponse = void; +export type BucketPermissionUpdatePermissionErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type S3KeyDeleteUserKeyError = HTTPValidationError; +export type BucketPermissionUpdatePermissionError = + BucketPermissionUpdatePermissionErrors[keyof BucketPermissionUpdatePermissionErrors]; -export type UserCreateUserData = { - body: UserIn; +export type BucketPermissionUpdatePermissionResponses = { + /** + * Successful Response + */ + 200: BucketPermissionOut; }; -export type UserCreateUserResponse = UserOutExtended; +export type BucketPermissionUpdatePermissionResponse = + BucketPermissionUpdatePermissionResponses[keyof BucketPermissionUpdatePermissionResponses]; -export type UserCreateUserError = HTTPValidationError; - -export type UserListUsersData = { +export type WorkflowListWorkflowsData = { + body?: never; + path?: never; query?: { /** - * Filter users by their role. If multiple are selected, they are concatenating by an OR Expression. + * Filter workflows by a substring in their name. */ - filter_roles?: Array<RoleEnum> | null; + name_substring?: string | null; /** - * Filter users by a substring in their name. + * Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`. */ - name_substring?: string | null; - }; -}; - -export type UserListUsersResponse = Array<UserOutExtended>; - -export type UserListUsersError = HTTPValidationError; - -export type UserSearchUsersData = { - query: { + version_status?: Array<WorkflowVersionStatus> | null; /** - * Filter users by a substring in their name. + * Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`. */ - name_substring: string; + developer_id?: string | null; }; + url: "/ui/workflows"; }; -export type UserSearchUsersResponse = Array<UserOut>; - -export type UserSearchUsersError = HTTPValidationError; +export type WorkflowListWorkflowsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type UserGetLoggedInUserResponse = UserOutExtended; +export type WorkflowListWorkflowsError = + WorkflowListWorkflowsErrors[keyof WorkflowListWorkflowsErrors]; -export type UserGetLoggedInUserError = unknown; - -export type UserGetUserData = { - path: { - /** - * UID of a user - */ - uid: string; - }; -}; - -export type UserGetUserResponse = UserOut; - -export type UserGetUserError = HTTPValidationError; - -export type UserUpdateRolesData = { - body: UserRoles; - path: { - /** - * UID of a user - */ - uid: string; - }; -}; - -export type UserUpdateRolesResponse = UserOutExtended; - -export type UserUpdateRolesError = HTTPValidationError; - -export type UserResendInvitationData = { - path: { - /** - * UID of a user - */ - uid: string; - }; +export type WorkflowListWorkflowsResponses = { + /** + * Successful Response + */ + 200: Array<WorkflowOut>; }; -export type UserResendInvitationResponse = UserOutExtended; - -export type UserResendInvitationError = HTTPValidationError; +export type WorkflowListWorkflowsResponse = + WorkflowListWorkflowsResponses[keyof WorkflowListWorkflowsResponses]; export type WorkflowCreateWorkflowData = { + /** + * Meta-date for the workflow to create + */ body: WorkflowIn; + path?: never; + query?: never; + url: "/ui/workflows"; }; -export type WorkflowCreateWorkflowResponse = WorkflowOut; +export type WorkflowCreateWorkflowErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowCreateWorkflowError = HTTPValidationError; +export type WorkflowCreateWorkflowError = + WorkflowCreateWorkflowErrors[keyof WorkflowCreateWorkflowErrors]; -export type WorkflowListWorkflowsData = { - query?: { - /** - * Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`. - */ - developer_id?: string | null; - /** - * Filter workflows by a substring in their name. - */ - name_substring?: string | null; - /** - * Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`. - */ - version_status?: Array<WorkflowVersionStatus> | null; - }; +export type WorkflowCreateWorkflowResponses = { + /** + * Successful Response + */ + 201: WorkflowOut; }; -export type WorkflowListWorkflowsResponse = Array<WorkflowOut>; - -export type WorkflowListWorkflowsError = HTTPValidationError; +export type WorkflowCreateWorkflowResponse = + WorkflowCreateWorkflowResponses[keyof WorkflowCreateWorkflowResponses]; export type WorkflowListWorkflowOtrsData = { + body?: never; + path?: never; query?: { /** * UID of user who is the current owner. @@ -2092,40 +2483,107 @@ export type WorkflowListWorkflowOtrsData = { */ new_owner_id?: string | null; }; + url: "/ui/workflows/ownership_transfer_request"; }; -export type WorkflowListWorkflowOtrsResponse = - Array<OwnershipTransferRequestOut>; +export type WorkflowListWorkflowOtrsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type WorkflowListWorkflowOtrsError = + WorkflowListWorkflowOtrsErrors[keyof WorkflowListWorkflowOtrsErrors]; + +export type WorkflowListWorkflowOtrsResponses = { + /** + * Successful Response + */ + 200: Array<OwnershipTransferRequestOut>; +}; -export type WorkflowListWorkflowOtrsError = HTTPValidationError; +export type WorkflowListWorkflowOtrsResponse = + WorkflowListWorkflowOtrsResponses[keyof WorkflowListWorkflowOtrsResponses]; export type WorkflowGetDeveloperWorkflowStatisticsData = { + body?: never; + path?: never; query?: { /** * Filter by the developer of the workflows */ developer_id?: string | null; /** - * Filter by workflow executions before this date + * Filter by workflow IDs */ - end?: string | null; + workflow_id?: Array<string> | null; /** * Filter by workflow executions after this date */ start?: string | null; /** - * Filter by workflow IDs + * Filter by workflow executions before this date */ - workflow_id?: Array<string> | null; + end?: string | null; }; + url: "/ui/workflows/developer_statistics"; +}; + +export type WorkflowGetDeveloperWorkflowStatisticsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type WorkflowGetDeveloperWorkflowStatisticsError = + WorkflowGetDeveloperWorkflowStatisticsErrors[keyof WorkflowGetDeveloperWorkflowStatisticsErrors]; + +export type WorkflowGetDeveloperWorkflowStatisticsResponses = { + /** + * Successful Response + */ + 200: Array<AnonymizedWorkflowExecution>; }; export type WorkflowGetDeveloperWorkflowStatisticsResponse = - Array<AnonymizedWorkflowExecution>; + WorkflowGetDeveloperWorkflowStatisticsResponses[keyof WorkflowGetDeveloperWorkflowStatisticsResponses]; + +export type WorkflowDeleteWorkflowData = { + body?: never; + path: { + /** + * ID of a workflow + */ + wid: string; + }; + query?: never; + url: "/ui/workflows/{wid}"; +}; + +export type WorkflowDeleteWorkflowErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type WorkflowDeleteWorkflowError = + WorkflowDeleteWorkflowErrors[keyof WorkflowDeleteWorkflowErrors]; + +export type WorkflowDeleteWorkflowResponses = { + /** + * Successful Response + */ + 204: void; +}; -export type WorkflowGetDeveloperWorkflowStatisticsError = HTTPValidationError; +export type WorkflowDeleteWorkflowResponse = + WorkflowDeleteWorkflowResponses[keyof WorkflowDeleteWorkflowResponses]; export type WorkflowGetWorkflowData = { + body?: never; path: { /** * ID of a workflow @@ -2138,179 +2596,620 @@ export type WorkflowGetWorkflowData = { */ version_status?: Array<WorkflowVersionStatus> | null; }; + url: "/ui/workflows/{wid}"; +}; + +export type WorkflowGetWorkflowErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; }; -export type WorkflowGetWorkflowResponse = WorkflowOut; +export type WorkflowGetWorkflowError = + WorkflowGetWorkflowErrors[keyof WorkflowGetWorkflowErrors]; + +export type WorkflowGetWorkflowResponses = { + /** + * Successful Response + */ + 200: WorkflowOut; +}; -export type WorkflowGetWorkflowError = HTTPValidationError; +export type WorkflowGetWorkflowResponse = + WorkflowGetWorkflowResponses[keyof WorkflowGetWorkflowResponses]; -export type WorkflowDeleteWorkflowData = { +export type WorkflowDeleteWorkflowOtrData = { + body?: never; path: { /** * ID of a workflow */ wid: string; }; + query?: never; + url: "/ui/workflows/{wid}/ownership_transfer_request"; }; -export type WorkflowDeleteWorkflowResponse = void; +export type WorkflowDeleteWorkflowOtrErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type WorkflowDeleteWorkflowOtrError = + WorkflowDeleteWorkflowOtrErrors[keyof WorkflowDeleteWorkflowOtrErrors]; + +export type WorkflowDeleteWorkflowOtrResponses = { + /** + * Successful Response + */ + 204: void; +}; -export type WorkflowDeleteWorkflowError = HTTPValidationError; +export type WorkflowDeleteWorkflowOtrResponse = + WorkflowDeleteWorkflowOtrResponses[keyof WorkflowDeleteWorkflowOtrResponses]; export type WorkflowGetWorkflowOtrData = { + body?: never; path: { /** * ID of a workflow */ wid: string; }; + query?: never; + url: "/ui/workflows/{wid}/ownership_transfer_request"; }; -export type WorkflowGetWorkflowOtrResponse = OwnershipTransferRequestOut; +export type WorkflowGetWorkflowOtrErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowGetWorkflowOtrError = HTTPValidationError; +export type WorkflowGetWorkflowOtrError = + WorkflowGetWorkflowOtrErrors[keyof WorkflowGetWorkflowOtrErrors]; -export type WorkflowCreateWorkflowOtrData = { - body: OwnershipTransferRequestIn; +export type WorkflowGetWorkflowOtrResponses = { + /** + * Successful Response + */ + 200: OwnershipTransferRequestOut; +}; + +export type WorkflowGetWorkflowOtrResponse = + WorkflowGetWorkflowOtrResponses[keyof WorkflowGetWorkflowOtrResponses]; + +export type WorkflowAcceptWorkflowOtrData = { + body?: never; path: { /** * ID of a workflow */ wid: string; }; + query?: never; + url: "/ui/workflows/{wid}/ownership_transfer_request"; }; -export type WorkflowCreateWorkflowOtrResponse = OwnershipTransferRequestOut; +export type WorkflowAcceptWorkflowOtrErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowCreateWorkflowOtrError = HTTPValidationError; +export type WorkflowAcceptWorkflowOtrError = + WorkflowAcceptWorkflowOtrErrors[keyof WorkflowAcceptWorkflowOtrErrors]; -export type WorkflowAcceptWorkflowOtrData = { +export type WorkflowAcceptWorkflowOtrResponses = { + /** + * Successful Response + */ + 200: WorkflowOut; +}; + +export type WorkflowAcceptWorkflowOtrResponse = + WorkflowAcceptWorkflowOtrResponses[keyof WorkflowAcceptWorkflowOtrResponses]; + +export type WorkflowCreateWorkflowOtrData = { + /** + * Meta-data for workflow OTR to create + */ + body: OwnershipTransferRequestIn; path: { /** * ID of a workflow */ wid: string; }; + query?: never; + url: "/ui/workflows/{wid}/ownership_transfer_request"; }; -export type WorkflowAcceptWorkflowOtrResponse = WorkflowOut; +export type WorkflowCreateWorkflowOtrErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowAcceptWorkflowOtrError = HTTPValidationError; +export type WorkflowCreateWorkflowOtrError = + WorkflowCreateWorkflowOtrErrors[keyof WorkflowCreateWorkflowOtrErrors]; -export type WorkflowDeleteWorkflowOtrData = { +export type WorkflowCreateWorkflowOtrResponses = { + /** + * Successful Response + */ + 201: OwnershipTransferRequestOut; +}; + +export type WorkflowCreateWorkflowOtrResponse = + WorkflowCreateWorkflowOtrResponses[keyof WorkflowCreateWorkflowOtrResponses]; + +export type WorkflowGetWorkflowStatisticsData = { + body?: never; path: { /** * ID of a workflow */ wid: string; }; + query?: never; + url: "/ui/workflows/{wid}/statistics"; }; -export type WorkflowDeleteWorkflowOtrResponse = void; +export type WorkflowGetWorkflowStatisticsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowDeleteWorkflowOtrError = HTTPValidationError; +export type WorkflowGetWorkflowStatisticsError = + WorkflowGetWorkflowStatisticsErrors[keyof WorkflowGetWorkflowStatisticsErrors]; -export type WorkflowGetWorkflowStatisticsData = { +export type WorkflowGetWorkflowStatisticsResponses = { + /** + * Successful Response + */ + 200: Array<WorkflowStatistic>; +}; + +export type WorkflowGetWorkflowStatisticsResponse = + WorkflowGetWorkflowStatisticsResponses[keyof WorkflowGetWorkflowStatisticsResponses]; + +export type WorkflowUpdateWorkflowData = { + /** + * Meta-data for the workflow version to create + */ + body: WorkflowUpdate; path: { /** * ID of a workflow */ wid: string; }; + query?: never; + url: "/ui/workflows/{wid}/update"; +}; + +export type WorkflowUpdateWorkflowErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; }; -export type WorkflowGetWorkflowStatisticsResponse = Array<WorkflowStatistic>; +export type WorkflowUpdateWorkflowError = + WorkflowUpdateWorkflowErrors[keyof WorkflowUpdateWorkflowErrors]; -export type WorkflowGetWorkflowStatisticsError = HTTPValidationError; +export type WorkflowUpdateWorkflowResponses = { + /** + * Successful Response + */ + 201: WorkflowVersionOut; +}; -export type WorkflowUpdateWorkflowData = { - body: WorkflowUpdate; +export type WorkflowUpdateWorkflowResponse = + WorkflowUpdateWorkflowResponses[keyof WorkflowUpdateWorkflowResponses]; + +export type WorkflowVersionListWorkflowVersionData = { + body?: never; path: { /** * ID of a workflow */ wid: string; }; + query?: { + /** + * Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED` + */ + version_status?: Array<WorkflowVersionStatus> | null; + }; + url: "/ui/workflows/{wid}/versions"; }; -export type WorkflowUpdateWorkflowResponse = WorkflowVersionOut; +export type WorkflowVersionListWorkflowVersionErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowUpdateWorkflowError = HTTPValidationError; +export type WorkflowVersionListWorkflowVersionError = + WorkflowVersionListWorkflowVersionErrors[keyof WorkflowVersionListWorkflowVersionErrors]; -export type WorkflowCredentialsGetWorkflowCredentialsData = { +export type WorkflowVersionListWorkflowVersionResponses = { + /** + * Successful Response + */ + 200: Array<WorkflowVersionOut>; +}; + +export type WorkflowVersionListWorkflowVersionResponse = + WorkflowVersionListWorkflowVersionResponses[keyof WorkflowVersionListWorkflowVersionResponses]; + +export type WorkflowVersionGetWorkflowVersionData = { + body?: never; path: { + /** + * Git commit `git_commit_hash` of specific version or `latest`. + */ + git_commit_hash: string; /** * ID of a workflow */ wid: string; }; + query?: never; + url: "/ui/workflows/{wid}/versions/{git_commit_hash}"; }; -export type WorkflowCredentialsGetWorkflowCredentialsResponse = - WorkflowCredentialsOut; +export type WorkflowVersionGetWorkflowVersionErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowCredentialsGetWorkflowCredentialsError = - HTTPValidationError; +export type WorkflowVersionGetWorkflowVersionError = + WorkflowVersionGetWorkflowVersionErrors[keyof WorkflowVersionGetWorkflowVersionErrors]; -export type WorkflowCredentialsUpdateWorkflowCredentialsData = { - body: WorkflowCredentialsIn; +export type WorkflowVersionGetWorkflowVersionResponses = { + /** + * Successful Response + */ + 200: WorkflowVersionOut; +}; + +export type WorkflowVersionGetWorkflowVersionResponse = + WorkflowVersionGetWorkflowVersionResponses[keyof WorkflowVersionGetWorkflowVersionResponses]; + +export type WorkflowVersionUpdateWorkflowVersionStatusData = { + /** + * New Status of the workflow version + */ + body: WorkflowVersionStatusSchema; path: { /** * ID of a workflow */ wid: string; + /** + * Git commit git_commit_hash of specific version. + */ + git_commit_hash: string; }; + query?: never; + url: "/ui/workflows/{wid}/versions/{git_commit_hash}/status"; }; -export type WorkflowCredentialsUpdateWorkflowCredentialsResponse = unknown; +export type WorkflowVersionUpdateWorkflowVersionStatusErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowCredentialsUpdateWorkflowCredentialsError = - HTTPValidationError; +export type WorkflowVersionUpdateWorkflowVersionStatusError = + WorkflowVersionUpdateWorkflowVersionStatusErrors[keyof WorkflowVersionUpdateWorkflowVersionStatusErrors]; -export type WorkflowCredentialsDeleteWorkflowCredentialsData = { +export type WorkflowVersionUpdateWorkflowVersionStatusResponses = { + /** + * Successful Response + */ + 200: WorkflowVersionOut; +}; + +export type WorkflowVersionUpdateWorkflowVersionStatusResponse = + WorkflowVersionUpdateWorkflowVersionStatusResponses[keyof WorkflowVersionUpdateWorkflowVersionStatusResponses]; + +export type WorkflowVersionGetWorkflowVersionMetadataData = { + body?: never; path: { /** * ID of a workflow */ wid: string; + /** + * Git commit git_commit_hash of specific version. + */ + git_commit_hash: string; }; + query?: never; + url: "/ui/workflows/{wid}/versions/{git_commit_hash}/metadata"; }; -export type WorkflowCredentialsDeleteWorkflowCredentialsResponse = void; +export type WorkflowVersionGetWorkflowVersionMetadataErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowCredentialsDeleteWorkflowCredentialsError = - HTTPValidationError; +export type WorkflowVersionGetWorkflowVersionMetadataError = + WorkflowVersionGetWorkflowVersionMetadataErrors[keyof WorkflowVersionGetWorkflowVersionMetadataErrors]; -export type WorkflowExecutionStartWorkflowData = { - body: WorkflowExecutionIn; +export type WorkflowVersionGetWorkflowVersionMetadataResponses = { + /** + * Successful Response + */ + 200: WorkflowVersionMetadataOut; }; -export type WorkflowExecutionStartWorkflowResponse = WorkflowExecutionOut; - -export type WorkflowExecutionStartWorkflowError = HTTPValidationError; +export type WorkflowVersionGetWorkflowVersionMetadataResponse = + WorkflowVersionGetWorkflowVersionMetadataResponses[keyof WorkflowVersionGetWorkflowVersionMetadataResponses]; -export type WorkflowExecutionListWorkflowExecutionsData = { - query?: { +export type WorkflowVersionUpdateWorkflowVersionMetadataData = { + body: WorkflowVersionMetadataIn; + path: { /** - * Filter for status of workflow execution + * ID of a workflow */ - execution_status?: Array<WorkflowExecutionStatus> | null; + wid: string; + /** + * Git commit git_commit_hash of specific version. + */ + git_commit_hash: string; + }; + query?: never; + url: "/ui/workflows/{wid}/versions/{git_commit_hash}/metadata"; +}; + +export type WorkflowVersionUpdateWorkflowVersionMetadataErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type WorkflowVersionUpdateWorkflowVersionMetadataError = + WorkflowVersionUpdateWorkflowVersionMetadataErrors[keyof WorkflowVersionUpdateWorkflowVersionMetadataErrors]; + +export type WorkflowVersionUpdateWorkflowVersionMetadataResponses = { + /** + * Successful Response + */ + 200: WorkflowVersionMetadataOut; +}; + +export type WorkflowVersionUpdateWorkflowVersionMetadataResponse = + WorkflowVersionUpdateWorkflowVersionMetadataResponses[keyof WorkflowVersionUpdateWorkflowVersionMetadataResponses]; + +export type WorkflowVersionDeprecateWorkflowVersionData = { + body?: never; + path: { + /** + * ID of a workflow + */ + wid: string; + /** + * Git commit git_commit_hash of specific version. + */ + git_commit_hash: string; + }; + query?: never; + url: "/ui/workflows/{wid}/versions/{git_commit_hash}/deprecate"; +}; + +export type WorkflowVersionDeprecateWorkflowVersionErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type WorkflowVersionDeprecateWorkflowVersionError = + WorkflowVersionDeprecateWorkflowVersionErrors[keyof WorkflowVersionDeprecateWorkflowVersionErrors]; + +export type WorkflowVersionDeprecateWorkflowVersionResponses = { + /** + * Successful Response + */ + 200: WorkflowVersionOut; +}; + +export type WorkflowVersionDeprecateWorkflowVersionResponse = + WorkflowVersionDeprecateWorkflowVersionResponses[keyof WorkflowVersionDeprecateWorkflowVersionResponses]; + +export type WorkflowVersionUpdateWorkflowVersionParameterExtensionData = { + /** + * Parameter extension specific for this CloWM instance + */ + body: ParameterExtensionInput; + path: { + /** + * ID of a workflow + */ + wid: string; + /** + * Git commit git_commit_hash of specific version. + */ + git_commit_hash: string; + }; + query?: never; + url: "/ui/workflows/{wid}/versions/{git_commit_hash}/parameter-extension"; +}; + +export type WorkflowVersionUpdateWorkflowVersionParameterExtensionErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type WorkflowVersionUpdateWorkflowVersionParameterExtensionError = + WorkflowVersionUpdateWorkflowVersionParameterExtensionErrors[keyof WorkflowVersionUpdateWorkflowVersionParameterExtensionErrors]; + +export type WorkflowVersionUpdateWorkflowVersionParameterExtensionResponses = { + /** + * Successful Response + */ + 200: WorkflowVersionOut; +}; + +export type WorkflowVersionUpdateWorkflowVersionParameterExtensionResponse = + WorkflowVersionUpdateWorkflowVersionParameterExtensionResponses[keyof WorkflowVersionUpdateWorkflowVersionParameterExtensionResponses]; + +export type WorkflowVersionDownloadWorkflowDocumentationData = { + body?: never; + path: { + /** + * ID of a workflow + */ + wid: string; + /** + * Git commit git_commit_hash of specific version. + */ + git_commit_hash: string; + }; + query?: { + /** + * Specify which type of documentation the client wants to fetch + */ + document?: DocumentationEnum; + /** + * Workflow Mode + */ + mode_id?: string | null; + }; + url: "/ui/workflows/{wid}/versions/{git_commit_hash}/documentation"; +}; + +export type WorkflowVersionDownloadWorkflowDocumentationErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type WorkflowVersionDownloadWorkflowDocumentationError = + WorkflowVersionDownloadWorkflowDocumentationErrors[keyof WorkflowVersionDownloadWorkflowDocumentationErrors]; + +export type WorkflowVersionDownloadWorkflowDocumentationResponses = { + /** + * Successful Response + */ + 200: unknown; +}; + +export type WorkflowVersionDeleteWorkflowVersionIconData = { + body?: never; + path: { + /** + * ID of a workflow + */ + wid: string; + /** + * Git commit git_commit_hash of specific version. + */ + git_commit_hash: string; + }; + query?: never; + url: "/ui/workflows/{wid}/versions/{git_commit_hash}/icon"; +}; + +export type WorkflowVersionDeleteWorkflowVersionIconErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type WorkflowVersionDeleteWorkflowVersionIconError = + WorkflowVersionDeleteWorkflowVersionIconErrors[keyof WorkflowVersionDeleteWorkflowVersionIconErrors]; + +export type WorkflowVersionDeleteWorkflowVersionIconResponses = { + /** + * Successful Response + */ + 204: void; +}; + +export type WorkflowVersionDeleteWorkflowVersionIconResponse = + WorkflowVersionDeleteWorkflowVersionIconResponses[keyof WorkflowVersionDeleteWorkflowVersionIconResponses]; + +export type WorkflowVersionUploadWorkflowVersionIconData = { + body: BodyWorkflowVersionUploadWorkflowVersionIcon; + path: { + /** + * ID of a workflow + */ + wid: string; + /** + * Git commit git_commit_hash of specific version. + */ + git_commit_hash: string; + }; + query?: never; + url: "/ui/workflows/{wid}/versions/{git_commit_hash}/icon"; +}; + +export type WorkflowVersionUploadWorkflowVersionIconErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type WorkflowVersionUploadWorkflowVersionIconError = + WorkflowVersionUploadWorkflowVersionIconErrors[keyof WorkflowVersionUploadWorkflowVersionIconErrors]; + +export type WorkflowVersionUploadWorkflowVersionIconResponses = { + /** + * Successful Response + */ + 201: IconUpdateOut; +}; + +export type WorkflowVersionUploadWorkflowVersionIconResponse = + WorkflowVersionUploadWorkflowVersionIconResponses[keyof WorkflowVersionUploadWorkflowVersionIconResponses]; + +export type WorkflowExecutionListWorkflowExecutionsData = { + body?: never; + path?: never; + query?: { /** * Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required. */ executor_id?: string | null; /** - * Id of the item to start the query from. DO NOT SET MANUALLY. + * Filter for status of workflow execution */ - id_after?: string | null; + execution_status?: Array<WorkflowExecutionStatus> | null; /** - * Number of items to list per page + * Filter for workflow version */ - per_page?: number; + workflow_version_id?: string | null; /** - * Sort order of items with creation time + * Filter for workflow */ - sort?: "asc" | "desc"; + workflow_id?: string | null; /** * Filter for workflow executions that started after this UNIX timestamp */ @@ -2320,340 +3219,1265 @@ export type WorkflowExecutionListWorkflowExecutionsData = { */ start_before?: number | null; /** - * Filter for workflow + * Id of the item to start the query from. DO NOT SET MANUALLY. */ - workflow_id?: string | null; + id_after?: string | null; /** - * Filter for workflow version + * Number of items to list per page */ - workflow_version_id?: string | null; + per_page?: number; + /** + * Sort order of items with creation time + */ + sort?: "asc" | "desc"; }; + url: "/ui/workflow_executions"; +}; + +export type WorkflowExecutionListWorkflowExecutionsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type WorkflowExecutionListWorkflowExecutionsError = + WorkflowExecutionListWorkflowExecutionsErrors[keyof WorkflowExecutionListWorkflowExecutionsErrors]; + +export type WorkflowExecutionListWorkflowExecutionsResponses = { + /** + * Successful Response + */ + 200: Array<WorkflowExecutionOut>; }; export type WorkflowExecutionListWorkflowExecutionsResponse = - Array<WorkflowExecutionOut>; + WorkflowExecutionListWorkflowExecutionsResponses[keyof WorkflowExecutionListWorkflowExecutionsResponses]; + +export type WorkflowExecutionStartWorkflowData = { + /** + * Meta-data and parameters for the workflow to start + */ + body: WorkflowExecutionIn; + path?: never; + query?: never; + url: "/ui/workflow_executions"; +}; + +export type WorkflowExecutionStartWorkflowErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type WorkflowExecutionStartWorkflowError = + WorkflowExecutionStartWorkflowErrors[keyof WorkflowExecutionStartWorkflowErrors]; + +export type WorkflowExecutionStartWorkflowResponses = { + /** + * Successful Response + */ + 201: WorkflowExecutionOut; +}; -export type WorkflowExecutionListWorkflowExecutionsError = HTTPValidationError; +export type WorkflowExecutionStartWorkflowResponse = + WorkflowExecutionStartWorkflowResponses[keyof WorkflowExecutionStartWorkflowResponses]; export type WorkflowExecutionStartArbitraryWorkflowData = { + /** + * Meta-data and parameters for the workflow to start + */ body: DevWorkflowExecutionIn; + path?: never; + query?: never; + url: "/ui/workflow_executions/arbitrary"; }; -export type WorkflowExecutionStartArbitraryWorkflowResponse = - WorkflowExecutionOut; +export type WorkflowExecutionStartArbitraryWorkflowErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowExecutionStartArbitraryWorkflowError = HTTPValidationError; +export type WorkflowExecutionStartArbitraryWorkflowError = + WorkflowExecutionStartArbitraryWorkflowErrors[keyof WorkflowExecutionStartArbitraryWorkflowErrors]; -export type WorkflowExecutionGetWorkflowExecutionData = { +export type WorkflowExecutionStartArbitraryWorkflowResponses = { + /** + * Successful Response + */ + 201: WorkflowExecutionOut; +}; + +export type WorkflowExecutionStartArbitraryWorkflowResponse = + WorkflowExecutionStartArbitraryWorkflowResponses[keyof WorkflowExecutionStartArbitraryWorkflowResponses]; + +export type WorkflowExecutionDeleteWorkflowExecutionData = { + body?: never; path: { /** * ID of a workflow execution. */ eid: string; }; + query?: never; + url: "/ui/workflow_executions/{eid}"; }; -export type WorkflowExecutionGetWorkflowExecutionResponse = - WorkflowExecutionOut; +export type WorkflowExecutionDeleteWorkflowExecutionErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowExecutionGetWorkflowExecutionError = HTTPValidationError; +export type WorkflowExecutionDeleteWorkflowExecutionError = + WorkflowExecutionDeleteWorkflowExecutionErrors[keyof WorkflowExecutionDeleteWorkflowExecutionErrors]; -export type WorkflowExecutionDeleteWorkflowExecutionData = { +export type WorkflowExecutionDeleteWorkflowExecutionResponses = { + /** + * Successful Response + */ + 204: void; +}; + +export type WorkflowExecutionDeleteWorkflowExecutionResponse = + WorkflowExecutionDeleteWorkflowExecutionResponses[keyof WorkflowExecutionDeleteWorkflowExecutionResponses]; + +export type WorkflowExecutionGetWorkflowExecutionData = { + body?: never; path: { /** * ID of a workflow execution. */ eid: string; }; + query?: never; + url: "/ui/workflow_executions/{eid}"; +}; + +export type WorkflowExecutionGetWorkflowExecutionErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; }; -export type WorkflowExecutionDeleteWorkflowExecutionResponse = void; +export type WorkflowExecutionGetWorkflowExecutionError = + WorkflowExecutionGetWorkflowExecutionErrors[keyof WorkflowExecutionGetWorkflowExecutionErrors]; + +export type WorkflowExecutionGetWorkflowExecutionResponses = { + /** + * Successful Response + */ + 200: WorkflowExecutionOut; +}; -export type WorkflowExecutionDeleteWorkflowExecutionError = HTTPValidationError; +export type WorkflowExecutionGetWorkflowExecutionResponse = + WorkflowExecutionGetWorkflowExecutionResponses[keyof WorkflowExecutionGetWorkflowExecutionResponses]; export type WorkflowExecutionGetWorkflowExecutionParamsData = { + body?: never; path: { /** * ID of a workflow execution. */ eid: string; }; + query?: never; + url: "/ui/workflow_executions/{eid}/params"; }; -export type WorkflowExecutionGetWorkflowExecutionParamsResponse = { - [key: string]: unknown; +export type WorkflowExecutionGetWorkflowExecutionParamsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; }; export type WorkflowExecutionGetWorkflowExecutionParamsError = - HTTPValidationError; + WorkflowExecutionGetWorkflowExecutionParamsErrors[keyof WorkflowExecutionGetWorkflowExecutionParamsErrors]; + +export type WorkflowExecutionGetWorkflowExecutionParamsResponses = { + /** + * Successful Response + */ + 200: { + [key: string]: unknown; + }; +}; + +export type WorkflowExecutionGetWorkflowExecutionParamsResponse = + WorkflowExecutionGetWorkflowExecutionParamsResponses[keyof WorkflowExecutionGetWorkflowExecutionParamsResponses]; export type WorkflowExecutionCancelWorkflowExecutionData = { + body?: never; path: { /** * ID of a workflow execution. */ eid: string; }; + query?: never; + url: "/ui/workflow_executions/{eid}/cancel"; }; -export type WorkflowExecutionCancelWorkflowExecutionResponse = void; +export type WorkflowExecutionCancelWorkflowExecutionErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowExecutionCancelWorkflowExecutionError = HTTPValidationError; +export type WorkflowExecutionCancelWorkflowExecutionError = + WorkflowExecutionCancelWorkflowExecutionErrors[keyof WorkflowExecutionCancelWorkflowExecutionErrors]; -export type WorkflowModeGetWorkflowModeData = { - path: { - /** - * ID of a workflow mode - */ - mode_id: string; - }; +export type WorkflowExecutionCancelWorkflowExecutionResponses = { + /** + * Successful Response + */ + 204: void; }; -export type WorkflowModeGetWorkflowModeResponse = WorkflowModeOut; - -export type WorkflowModeGetWorkflowModeError = HTTPValidationError; +export type WorkflowExecutionCancelWorkflowExecutionResponse = + WorkflowExecutionCancelWorkflowExecutionResponses[keyof WorkflowExecutionCancelWorkflowExecutionResponses]; -export type WorkflowVersionListWorkflowVersionData = { +export type WorkflowCredentialsDeleteWorkflowCredentialsData = { + body?: never; + path: { + /** + * ID of a workflow + */ + wid: string; + }; + query?: never; + url: "/ui/workflows/{wid}/credentials"; +}; + +export type WorkflowCredentialsDeleteWorkflowCredentialsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type WorkflowCredentialsDeleteWorkflowCredentialsError = + WorkflowCredentialsDeleteWorkflowCredentialsErrors[keyof WorkflowCredentialsDeleteWorkflowCredentialsErrors]; + +export type WorkflowCredentialsDeleteWorkflowCredentialsResponses = { + /** + * Successful Response + */ + 204: void; +}; + +export type WorkflowCredentialsDeleteWorkflowCredentialsResponse = + WorkflowCredentialsDeleteWorkflowCredentialsResponses[keyof WorkflowCredentialsDeleteWorkflowCredentialsResponses]; + +export type WorkflowCredentialsGetWorkflowCredentialsData = { + body?: never; + path: { + /** + * ID of a workflow + */ + wid: string; + }; + query?: never; + url: "/ui/workflows/{wid}/credentials"; +}; + +export type WorkflowCredentialsGetWorkflowCredentialsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type WorkflowCredentialsGetWorkflowCredentialsError = + WorkflowCredentialsGetWorkflowCredentialsErrors[keyof WorkflowCredentialsGetWorkflowCredentialsErrors]; + +export type WorkflowCredentialsGetWorkflowCredentialsResponses = { + /** + * Successful Response + */ + 200: WorkflowCredentialsOut; +}; + +export type WorkflowCredentialsGetWorkflowCredentialsResponse = + WorkflowCredentialsGetWorkflowCredentialsResponses[keyof WorkflowCredentialsGetWorkflowCredentialsResponses]; + +export type WorkflowCredentialsUpdateWorkflowCredentialsData = { + /** + * Updated credentials for the workflow git repository + */ + body: WorkflowCredentialsIn; + path: { + /** + * ID of a workflow + */ + wid: string; + }; + query?: never; + url: "/ui/workflows/{wid}/credentials"; +}; + +export type WorkflowCredentialsUpdateWorkflowCredentialsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type WorkflowCredentialsUpdateWorkflowCredentialsError = + WorkflowCredentialsUpdateWorkflowCredentialsErrors[keyof WorkflowCredentialsUpdateWorkflowCredentialsErrors]; + +export type WorkflowCredentialsUpdateWorkflowCredentialsResponses = { + /** + * Successful Response + */ + 200: unknown; +}; + +export type WorkflowModeGetWorkflowModeData = { + body?: never; + path: { + /** + * ID of a workflow mode + */ + mode_id: string; + }; + query?: never; + url: "/ui/workflow_modes/{mode_id}"; +}; + +export type WorkflowModeGetWorkflowModeErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type WorkflowModeGetWorkflowModeError = + WorkflowModeGetWorkflowModeErrors[keyof WorkflowModeGetWorkflowModeErrors]; + +export type WorkflowModeGetWorkflowModeResponses = { + /** + * Successful Response + */ + 200: WorkflowModeOut; +}; + +export type WorkflowModeGetWorkflowModeResponse = + WorkflowModeGetWorkflowModeResponses[keyof WorkflowModeGetWorkflowModeResponses]; + +export type ResourceListResourcesData = { + body?: never; + path?: never; + query?: { + /** + * Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`. + */ + maintainer_id?: string | null; + /** + * Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required. + */ + version_status?: Array<ResourceVersionStatus> | null; + /** + * Filter resources by a substring in their name. + */ + name_substring?: string | null; + /** + * Filter resources to by the public flag + */ + public?: boolean | null; + }; + url: "/ui/resources"; +}; + +export type ResourceListResourcesErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type ResourceListResourcesError = + ResourceListResourcesErrors[keyof ResourceListResourcesErrors]; + +export type ResourceListResourcesResponses = { + /** + * Successful Response + */ + 200: Array<ResourceOut>; +}; + +export type ResourceListResourcesResponse = + ResourceListResourcesResponses[keyof ResourceListResourcesResponses]; + +export type ResourceCreateResourceData = { + /** + * Meta-data for the resource to request + */ + body: ResourceIn; + path?: never; + query?: never; + url: "/ui/resources"; +}; + +export type ResourceCreateResourceErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type ResourceCreateResourceError = + ResourceCreateResourceErrors[keyof ResourceCreateResourceErrors]; + +export type ResourceCreateResourceResponses = { + /** + * Successful Response + */ + 201: ResourceOut; +}; + +export type ResourceCreateResourceResponse = + ResourceCreateResourceResponses[keyof ResourceCreateResourceResponses]; + +export type ResourceListSyncRequestsData = { + body?: never; + path?: never; + query?: never; + url: "/ui/resources/sync_requests"; +}; + +export type ResourceListSyncRequestsResponses = { + /** + * Successful Response + */ + 200: Array<UserSynchronizationRequestOut>; +}; + +export type ResourceListSyncRequestsResponse = + ResourceListSyncRequestsResponses[keyof ResourceListSyncRequestsResponses]; + +export type ResourceListResourceOtrsData = { + body?: never; + path?: never; + query?: { + /** + * UID of user who is the current owner. + */ + current_owner_id?: string | null; + /** + * UID of user who will be the new owner. + */ + new_owner_id?: string | null; + }; + url: "/ui/resources/ownership_transfer_request"; +}; + +export type ResourceListResourceOtrsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type ResourceListResourceOtrsError = + ResourceListResourceOtrsErrors[keyof ResourceListResourceOtrsErrors]; + +export type ResourceListResourceOtrsResponses = { + /** + * Successful Response + */ + 200: Array<OwnershipTransferRequestOut>; +}; + +export type ResourceListResourceOtrsResponse = + ResourceListResourceOtrsResponses[keyof ResourceListResourceOtrsResponses]; + +export type ResourceDeleteResourceData = { + body?: never; + path: { + /** + * ID of a resource + */ + rid: string; + }; + query?: never; + url: "/ui/resources/{rid}"; +}; + +export type ResourceDeleteResourceErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type ResourceDeleteResourceError = + ResourceDeleteResourceErrors[keyof ResourceDeleteResourceErrors]; + +export type ResourceDeleteResourceResponses = { + /** + * Successful Response + */ + 204: void; +}; + +export type ResourceDeleteResourceResponse = + ResourceDeleteResourceResponses[keyof ResourceDeleteResourceResponses]; + +export type ResourceGetResourceData = { + body?: never; + path: { + /** + * ID of a resource + */ + rid: string; + }; + query?: { + /** + * Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required. + */ + version_status?: Array<ResourceVersionStatus> | null; + }; + url: "/ui/resources/{rid}"; +}; + +export type ResourceGetResourceErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type ResourceGetResourceError = + ResourceGetResourceErrors[keyof ResourceGetResourceErrors]; + +export type ResourceGetResourceResponses = { + /** + * Successful Response + */ + 200: ResourceOut; +}; + +export type ResourceGetResourceResponse = + ResourceGetResourceResponses[keyof ResourceGetResourceResponses]; + +export type ResourceDeleteResourceOtrData = { + body?: never; + path: { + /** + * ID of a resource + */ + rid: string; + }; + query?: never; + url: "/ui/resources/{rid}/ownership_transfer_request"; +}; + +export type ResourceDeleteResourceOtrErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type ResourceDeleteResourceOtrError = + ResourceDeleteResourceOtrErrors[keyof ResourceDeleteResourceOtrErrors]; + +export type ResourceDeleteResourceOtrResponses = { + /** + * Successful Response + */ + 204: void; +}; + +export type ResourceDeleteResourceOtrResponse = + ResourceDeleteResourceOtrResponses[keyof ResourceDeleteResourceOtrResponses]; + +export type ResourceGetResourceOtrData = { + body?: never; + path: { + /** + * ID of a resource + */ + rid: string; + }; + query?: never; + url: "/ui/resources/{rid}/ownership_transfer_request"; +}; + +export type ResourceGetResourceOtrErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type ResourceGetResourceOtrError = + ResourceGetResourceOtrErrors[keyof ResourceGetResourceOtrErrors]; + +export type ResourceGetResourceOtrResponses = { + /** + * Successful Response + */ + 200: OwnershipTransferRequestOut; +}; + +export type ResourceGetResourceOtrResponse = + ResourceGetResourceOtrResponses[keyof ResourceGetResourceOtrResponses]; + +export type ResourceAcceptResourceOtrData = { + body?: never; + path: { + /** + * ID of a resource + */ + rid: string; + }; + query?: never; + url: "/ui/resources/{rid}/ownership_transfer_request"; +}; + +export type ResourceAcceptResourceOtrErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type ResourceAcceptResourceOtrError = + ResourceAcceptResourceOtrErrors[keyof ResourceAcceptResourceOtrErrors]; + +export type ResourceAcceptResourceOtrResponses = { + /** + * Successful Response + */ + 200: ResourceOut; +}; + +export type ResourceAcceptResourceOtrResponse = + ResourceAcceptResourceOtrResponses[keyof ResourceAcceptResourceOtrResponses]; + +export type ResourceCreateResourceOtrData = { + /** + * Meta-data for the resource OTR to create + */ + body: OwnershipTransferRequestIn; + path: { + /** + * ID of a resource + */ + rid: string; + }; + query?: never; + url: "/ui/resources/{rid}/ownership_transfer_request"; +}; + +export type ResourceCreateResourceOtrErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type ResourceCreateResourceOtrError = + ResourceCreateResourceOtrErrors[keyof ResourceCreateResourceOtrErrors]; + +export type ResourceCreateResourceOtrResponses = { + /** + * Successful Response + */ + 201: OwnershipTransferRequestOut; +}; + +export type ResourceCreateResourceOtrResponse = + ResourceCreateResourceOtrResponses[keyof ResourceCreateResourceOtrResponses]; + +export type ResourceVersionListResourceVersionsData = { + body?: never; + path: { + /** + * ID of a resource + */ + rid: string; + }; + query?: { + /** + * Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required. + */ + version_status?: Array<ResourceVersionStatus> | null; + }; + url: "/ui/resources/{rid}/versions"; +}; + +export type ResourceVersionListResourceVersionsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type ResourceVersionListResourceVersionsError = + ResourceVersionListResourceVersionsErrors[keyof ResourceVersionListResourceVersionsErrors]; + +export type ResourceVersionListResourceVersionsResponses = { + /** + * Successful Response + */ + 200: Array<ResourceVersionOut>; +}; + +export type ResourceVersionListResourceVersionsResponse = + ResourceVersionListResourceVersionsResponses[keyof ResourceVersionListResourceVersionsResponses]; + +export type ResourceVersionRequestResourceVersionData = { + /** + * Meta-data for the resource version to request + */ + body: ResourceVersionIn; + path: { + /** + * ID of a resource + */ + rid: string; + }; + query?: never; + url: "/ui/resources/{rid}/versions"; +}; + +export type ResourceVersionRequestResourceVersionErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type ResourceVersionRequestResourceVersionError = + ResourceVersionRequestResourceVersionErrors[keyof ResourceVersionRequestResourceVersionErrors]; + +export type ResourceVersionRequestResourceVersionResponses = { + /** + * Successful Response + */ + 201: ResourceVersionOut; +}; + +export type ResourceVersionRequestResourceVersionResponse = + ResourceVersionRequestResourceVersionResponses[keyof ResourceVersionRequestResourceVersionResponses]; + +export type ResourceVersionGetResourceVersionData = { + body?: never; + path: { + /** + * ID of a resource + */ + rid: string; + /** + * ID of a resource version + */ + rvid: string; + }; + query?: never; + url: "/ui/resources/{rid}/versions/{rvid}"; +}; + +export type ResourceVersionGetResourceVersionErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type ResourceVersionGetResourceVersionError = + ResourceVersionGetResourceVersionErrors[keyof ResourceVersionGetResourceVersionErrors]; + +export type ResourceVersionGetResourceVersionResponses = { + /** + * Successful Response + */ + 200: ResourceVersionOut; +}; + +export type ResourceVersionGetResourceVersionResponse = + ResourceVersionGetResourceVersionResponses[keyof ResourceVersionGetResourceVersionResponses]; + +export type ResourceVersionResourceFileTreeData = { + body?: never; + path: { + /** + * ID of a resource version + */ + rvid: string; + /** + * ID of a resource + */ + rid: string; + }; + query?: never; + url: "/ui/resources/{rid}/versions/{rvid}/tree"; +}; + +export type ResourceVersionResourceFileTreeErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type ResourceVersionResourceFileTreeError = + ResourceVersionResourceFileTreeErrors[keyof ResourceVersionResourceFileTreeErrors]; + +export type ResourceVersionResourceFileTreeResponses = { + /** + * Successful Response + */ + 200: Array<FileTree>; +}; + +export type ResourceVersionResourceFileTreeResponse = + ResourceVersionResourceFileTreeResponses[keyof ResourceVersionResourceFileTreeResponses]; + +export type ResourceVersionRequestResourceVersionReviewData = { + body?: never; path: { /** - * ID of a workflow + * ID of a resource */ - wid: string; - }; - query?: { + rid: string; /** - * Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED` + * ID of a resource version */ - version_status?: Array<WorkflowVersionStatus> | null; + rvid: string; }; + query?: never; + url: "/ui/resources/{rid}/versions/{rvid}/request_review"; }; -export type WorkflowVersionListWorkflowVersionResponse = - Array<WorkflowVersionOut>; +export type ResourceVersionRequestResourceVersionReviewErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowVersionListWorkflowVersionError = HTTPValidationError; +export type ResourceVersionRequestResourceVersionReviewError = + ResourceVersionRequestResourceVersionReviewErrors[keyof ResourceVersionRequestResourceVersionReviewErrors]; -export type WorkflowVersionGetWorkflowVersionData = { +export type ResourceVersionRequestResourceVersionReviewResponses = { + /** + * Successful Response + */ + 200: ResourceVersionOut; +}; + +export type ResourceVersionRequestResourceVersionReviewResponse = + ResourceVersionRequestResourceVersionReviewResponses[keyof ResourceVersionRequestResourceVersionReviewResponses]; + +export type ResourceVersionRequestResourceVersionSyncData = { + /** + * Meta-data for the synchronization request + */ + body: UserSynchronizationRequestIn; path: { /** - * Git commit `git_commit_hash` of specific version or `latest`. + * ID of a resource */ - git_commit_hash: string; + rid: string; /** - * ID of a workflow + * ID of a resource version */ - wid: string; + rvid: string; }; + query?: never; + url: "/ui/resources/{rid}/versions/{rvid}/request_sync"; }; -export type WorkflowVersionGetWorkflowVersionResponse = WorkflowVersionOut; +export type ResourceVersionRequestResourceVersionSyncErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowVersionGetWorkflowVersionError = HTTPValidationError; +export type ResourceVersionRequestResourceVersionSyncError = + ResourceVersionRequestResourceVersionSyncErrors[keyof ResourceVersionRequestResourceVersionSyncErrors]; -export type WorkflowVersionUpdateWorkflowVersionStatusData = { - body: WorkflowVersionStatusSchema; +export type ResourceVersionRequestResourceVersionSyncResponses = { + /** + * Successful Response + */ + 200: ResourceVersionOut; +}; + +export type ResourceVersionRequestResourceVersionSyncResponse = + ResourceVersionRequestResourceVersionSyncResponses[keyof ResourceVersionRequestResourceVersionSyncResponses]; + +export type ResourceVersionResourceVersionReviewData = { + /** + * Answer for the resource version review + */ + body: UserRequestAnswer; path: { /** - * Git commit git_commit_hash of specific version. + * ID of a resource */ - git_commit_hash: string; + rid: string; /** - * ID of a workflow + * ID of a resource version */ - wid: string; + rvid: string; }; + query?: never; + url: "/ui/resources/{rid}/versions/{rvid}/review"; }; -export type WorkflowVersionUpdateWorkflowVersionStatusResponse = - WorkflowVersionOut; +export type ResourceVersionResourceVersionReviewErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowVersionUpdateWorkflowVersionStatusError = - HTTPValidationError; +export type ResourceVersionResourceVersionReviewError = + ResourceVersionResourceVersionReviewErrors[keyof ResourceVersionResourceVersionReviewErrors]; -export type WorkflowVersionGetWorkflowVersionMetadataData = { +export type ResourceVersionResourceVersionReviewResponses = { + /** + * Successful Response + */ + 200: ResourceVersionOut; +}; + +export type ResourceVersionResourceVersionReviewResponse = + ResourceVersionResourceVersionReviewResponses[keyof ResourceVersionResourceVersionReviewResponses]; + +export type ResourceVersionResourceVersionSyncData = { + /** + * Answer to the resource version synchronization request + */ + body: UserRequestAnswer; path: { /** - * Git commit git_commit_hash of specific version. + * ID of a resource */ - git_commit_hash: string; + rid: string; /** - * ID of a workflow + * ID of a resource version */ - wid: string; + rvid: string; }; + query?: never; + url: "/ui/resources/{rid}/versions/{rvid}/sync"; }; -export type WorkflowVersionGetWorkflowVersionMetadataResponse = - WorkflowVersionMetadataOut; +export type ResourceVersionResourceVersionSyncErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowVersionGetWorkflowVersionMetadataError = - HTTPValidationError; +export type ResourceVersionResourceVersionSyncError = + ResourceVersionResourceVersionSyncErrors[keyof ResourceVersionResourceVersionSyncErrors]; -export type WorkflowVersionUpdateWorkflowVersionMetadataData = { - body: WorkflowVersionMetadataIn; +export type ResourceVersionResourceVersionSyncResponses = { + /** + * Successful Response + */ + 200: ResourceVersionOut; +}; + +export type ResourceVersionResourceVersionSyncResponse = + ResourceVersionResourceVersionSyncResponses[keyof ResourceVersionResourceVersionSyncResponses]; + +export type ResourceVersionResourceVersionLatestData = { + body?: never; path: { /** - * Git commit git_commit_hash of specific version. + * ID of a resource */ - git_commit_hash: string; + rid: string; /** - * ID of a workflow + * ID of a resource version */ - wid: string; + rvid: string; }; + query?: never; + url: "/ui/resources/{rid}/versions/{rvid}/latest"; }; -export type WorkflowVersionUpdateWorkflowVersionMetadataResponse = - WorkflowVersionMetadataOut; +export type ResourceVersionResourceVersionLatestErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowVersionUpdateWorkflowVersionMetadataError = - HTTPValidationError; +export type ResourceVersionResourceVersionLatestError = + ResourceVersionResourceVersionLatestErrors[keyof ResourceVersionResourceVersionLatestErrors]; -export type WorkflowVersionDeprecateWorkflowVersionData = { +export type ResourceVersionResourceVersionLatestResponses = { + /** + * Successful Response + */ + 200: ResourceVersionOut; +}; + +export type ResourceVersionResourceVersionLatestResponse = + ResourceVersionResourceVersionLatestResponses[keyof ResourceVersionResourceVersionLatestResponses]; + +export type ResourceVersionDeleteResourceVersionClusterData = { + body?: never; path: { /** - * Git commit git_commit_hash of specific version. + * ID of a resource */ - git_commit_hash: string; + rid: string; /** - * ID of a workflow + * ID of a resource version */ - wid: string; + rvid: string; }; + query?: never; + url: "/ui/resources/{rid}/versions/{rvid}/cluster"; }; -export type WorkflowVersionDeprecateWorkflowVersionResponse = - WorkflowVersionOut; +export type ResourceVersionDeleteResourceVersionClusterErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowVersionDeprecateWorkflowVersionError = HTTPValidationError; +export type ResourceVersionDeleteResourceVersionClusterError = + ResourceVersionDeleteResourceVersionClusterErrors[keyof ResourceVersionDeleteResourceVersionClusterErrors]; -export type WorkflowVersionUpdateWorkflowVersionParameterExtensionData = { - body: ParameterExtension_Input; +export type ResourceVersionDeleteResourceVersionClusterResponses = { + /** + * Successful Response + */ + 200: ResourceVersionOut; +}; + +export type ResourceVersionDeleteResourceVersionClusterResponse = + ResourceVersionDeleteResourceVersionClusterResponses[keyof ResourceVersionDeleteResourceVersionClusterResponses]; + +export type ResourceVersionDeleteResourceVersionS3Data = { + body?: never; path: { /** - * Git commit git_commit_hash of specific version. + * ID of a resource */ - git_commit_hash: string; + rid: string; /** - * ID of a workflow + * ID of a resource version */ - wid: string; + rvid: string; }; + query?: never; + url: "/ui/resources/{rid}/versions/{rvid}/s3"; }; -export type WorkflowVersionUpdateWorkflowVersionParameterExtensionResponse = - WorkflowVersionOut; +export type ResourceVersionDeleteResourceVersionS3Errors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowVersionUpdateWorkflowVersionParameterExtensionError = - HTTPValidationError; +export type ResourceVersionDeleteResourceVersionS3Error = + ResourceVersionDeleteResourceVersionS3Errors[keyof ResourceVersionDeleteResourceVersionS3Errors]; -export type WorkflowVersionDownloadWorkflowDocumentationData = { - path: { +export type ResourceVersionDeleteResourceVersionS3Responses = { + /** + * Successful Response + */ + 200: ResourceVersionOut; +}; + +export type ResourceVersionDeleteResourceVersionS3Response = + ResourceVersionDeleteResourceVersionS3Responses[keyof ResourceVersionDeleteResourceVersionS3Responses]; + +export type NewsListNewsData = { + body?: never; + path?: never; + query?: { /** - * Git commit git_commit_hash of specific version. + * Filter for news that are created after this UNIX timestamp */ - git_commit_hash: string; + created_after?: number | null; /** - * ID of a workflow + * Filter for news created by a specific user */ - wid: string; - }; - query?: { + creator_id?: string | null; /** - * Specify which type of documentation the client wants to fetch + * Id of the item to start the query from. DO NOT SET MANUALLY. */ - document?: DocumentationEnum; + id_after?: string | null; /** - * Workflow Mode + * Number of items to list per page */ - mode_id?: string | null; + per_page?: number; + /** + * Sort order of items with creation time + */ + sort?: "asc" | "desc"; }; + url: "/ui/news"; }; -export type WorkflowVersionDownloadWorkflowDocumentationResponse = unknown; +export type NewsListNewsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type WorkflowVersionDownloadWorkflowDocumentationError = - HTTPValidationError; +export type NewsListNewsError = NewsListNewsErrors[keyof NewsListNewsErrors]; -export type WorkflowVersionUploadWorkflowVersionIconData = { - body: Body_Workflow_Version_upload_workflow_version_icon; +export type NewsListNewsResponses = { + /** + * Successful Response + */ + 200: Array<NewsOut>; +}; + +export type NewsListNewsResponse = + NewsListNewsResponses[keyof NewsListNewsResponses]; + +export type NewsCreateNewsData = { + /** + * Meta-data for news event to create + */ + body: NewsIn; + path?: never; + query?: never; + url: "/ui/news"; +}; + +export type NewsCreateNewsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type NewsCreateNewsError = + NewsCreateNewsErrors[keyof NewsCreateNewsErrors]; + +export type NewsCreateNewsResponses = { + /** + * Successful Response + */ + 201: NewsOut; +}; + +export type NewsCreateNewsResponse = + NewsCreateNewsResponses[keyof NewsCreateNewsResponses]; + +export type NewsListLatestNewsData = { + body?: never; + path?: never; + query?: never; + url: "/ui/news/latest"; +}; + +export type NewsListLatestNewsResponses = { + /** + * Successful Response + */ + 200: Array<NewsOut>; +}; + +export type NewsListLatestNewsResponse = + NewsListLatestNewsResponses[keyof NewsListLatestNewsResponses]; + +export type NewsDeleteNewsData = { + body?: never; path: { /** - * Git commit git_commit_hash of specific version. - */ - git_commit_hash: string; - /** - * ID of a workflow + * ID of a news event */ - wid: string; + nid: string; }; + query?: never; + url: "/ui/news/{nid}"; +}; + +export type NewsDeleteNewsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; }; -export type WorkflowVersionUploadWorkflowVersionIconResponse = IconUpdateOut; +export type NewsDeleteNewsError = + NewsDeleteNewsErrors[keyof NewsDeleteNewsErrors]; + +export type NewsDeleteNewsResponses = { + /** + * Successful Response + */ + 204: void; +}; -export type WorkflowVersionUploadWorkflowVersionIconError = HTTPValidationError; +export type NewsDeleteNewsResponse = + NewsDeleteNewsResponses[keyof NewsDeleteNewsResponses]; -export type WorkflowVersionDeleteWorkflowVersionIconData = { +export type NewsGetNewsData = { + body?: never; path: { /** - * Git commit git_commit_hash of specific version. - */ - git_commit_hash: string; - /** - * ID of a workflow + * ID of a news event */ - wid: string; + nid: string; }; + query?: never; + url: "/ui/news/{nid}"; }; -export type WorkflowVersionDeleteWorkflowVersionIconResponse = void; - -export type WorkflowVersionDeleteWorkflowVersionIconError = HTTPValidationError; - -export type WorkflowGetDeveloperWorkflowStatisticsResponseTransformer = ( - data: any, -) => Promise<WorkflowGetDeveloperWorkflowStatisticsResponse>; +export type NewsGetNewsErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; -export type AnonymizedWorkflowExecutionModelResponseTransformer = ( - data: any, -) => AnonymizedWorkflowExecution; +export type NewsGetNewsError = NewsGetNewsErrors[keyof NewsGetNewsErrors]; -export const AnonymizedWorkflowExecutionModelResponseTransformer: AnonymizedWorkflowExecutionModelResponseTransformer = - (data) => { - if (data?.started_at) { - data.started_at = new Date(data.started_at); - } - return data; - }; +export type NewsGetNewsResponses = { + /** + * Successful Response + */ + 200: NewsOut; +}; -export const WorkflowGetDeveloperWorkflowStatisticsResponseTransformer: WorkflowGetDeveloperWorkflowStatisticsResponseTransformer = - async (data) => { - if (Array.isArray(data)) { - data.forEach(AnonymizedWorkflowExecutionModelResponseTransformer); - } - return data; - }; +export type NewsGetNewsResponse = + NewsGetNewsResponses[keyof NewsGetNewsResponses]; -export type WorkflowGetWorkflowStatisticsResponseTransformer = ( - data: any, -) => Promise<WorkflowGetWorkflowStatisticsResponse>; +export type PublicGetPublicWorkflowsData = { + body?: never; + path?: never; + query?: never; + url: "/ui/public/workflows"; +}; -export type WorkflowStatisticModelResponseTransformer = ( - data: any, -) => WorkflowStatistic; +export type PublicGetPublicWorkflowsResponses = { + /** + * Successful Response + */ + 200: Array<PublicWorkflowOut>; +}; -export const WorkflowStatisticModelResponseTransformer: WorkflowStatisticModelResponseTransformer = - (data) => { - if (data?.day) { - data.day = new Date(data.day); - } - return data; - }; +export type PublicGetPublicWorkflowsResponse = + PublicGetPublicWorkflowsResponses[keyof PublicGetPublicWorkflowsResponses]; -export const WorkflowGetWorkflowStatisticsResponseTransformer: WorkflowGetWorkflowStatisticsResponseTransformer = - async (data) => { - if (Array.isArray(data)) { - data.forEach(WorkflowStatisticModelResponseTransformer); - } - return data; - }; +export type ClientOptions = { + baseURL: `${string}://${string}/api` | (string & {}); +}; diff --git a/src/components/AppHeader.vue b/src/components/AppHeader.vue index e69143a..a9f8509 100644 --- a/src/components/AppHeader.vue +++ b/src/components/AppHeader.vue @@ -341,24 +341,16 @@ watch( style="z-index: 1025 !important" > <li> - <router-link class="dropdown-item" :to="{ name: 'api-tokens' }" - >API tokens + <router-link class="dropdown-item" :to="{ name: 'profile' }"> + My Profile </router-link> </li> <li> - <hr class="dropdown-divider" /> - </li> - <li v-if="userRepository.user.email" class="dropdown-item disabled"> - {{ userRepository.user.email }} - </li> - <li><h6 class="dropdown-header">Roles</h6></li> - <li - v-for="role in userRepository.roles" - :key="role" - class="dropdown-item text-capitalize disabled" - > - {{ role }} + <router-link class="dropdown-item" :to="{ name: 'api-tokens' }"> + My API tokens + </router-link> </li> + <li> <hr class="dropdown-divider" /> </li> @@ -378,8 +370,9 @@ watch( class="btn btn-info btn-sm ms-2" role="button" :to="{ name: 'login' }" - >Login</router-link > + Login + </router-link> </nav> </header> </template> diff --git a/src/components/parameter-schema/ParameterSchemaFormComponent.vue b/src/components/parameter-schema/ParameterSchemaFormComponent.vue index e65fcd4..7922022 100644 --- a/src/components/parameter-schema/ParameterSchemaFormComponent.vue +++ b/src/components/parameter-schema/ParameterSchemaFormComponent.vue @@ -22,7 +22,7 @@ import { import { useWorkflowExecutionStore } from "@/stores/workflowExecutions"; import { NextflowVersion, ParameterVisibility } from "@/client/types.gen"; import type { - ParameterExtension_Output, + ParameterExtensionOutput, ParameterVisibilityMapping, } from "@/client/types.gen"; import { flattenParameters, nestParameters } from "@/utils/Workflow"; @@ -44,7 +44,7 @@ const props = defineProps({ required: false, }, parameterExtension: { - type: Object as PropType<ParameterExtension_Output>, + type: Object as PropType<ParameterExtensionOutput>, required: false, }, loading: { @@ -394,7 +394,7 @@ onMounted(() => { Directory in bucket where to save Nextflow log and reports </div> </div> - <div v-if="props.nextflowVersion >= NextflowVersion._23_04_0"> + <div v-if="props.nextflowVersion >= NextflowVersion['23_04_0']"> <code class="bg-secondary-subtle p-2 rounded-top border border-secondary" >--provenance_s3_path</code diff --git a/src/components/workflows/WorkflowDocumentationTabs.vue b/src/components/workflows/WorkflowDocumentationTabs.vue index e375fb8..35ecf6f 100644 --- a/src/components/workflows/WorkflowDocumentationTabs.vue +++ b/src/components/workflows/WorkflowDocumentationTabs.vue @@ -4,7 +4,7 @@ import MarkdownRenderer from "@/components/MarkdownRenderer.vue"; import ParameterSchemaDescriptionComponent from "@/components/parameter-schema/ParameterSchemaDescriptionComponent.vue"; import { useRoute } from "vue-router"; import type { ClowmInfo } from "@/types/ClowmInfo"; -import type { ParameterExtension_Output } from "@/client"; +import type { ParameterExtensionOutput } from "@/client/types.gen.ts"; const route = useRoute(); @@ -16,7 +16,7 @@ const props = defineProps<{ outputMarkdown?: string; citationsMarkdown?: string; parameterSchema?: Record<string, never>; - parameterExtension?: ParameterExtension_Output | null; + parameterExtension?: ParameterExtensionOutput | null; clowmInfo?: ClowmInfo; }>(); diff --git a/src/router/userRoutes.ts b/src/router/userRoutes.ts index 5dee8da..b23b237 100644 --- a/src/router/userRoutes.ts +++ b/src/router/userRoutes.ts @@ -9,4 +9,16 @@ export const userRoutes: RouteRecordRaw[] = [ title: "API Tokens", }, }, + { + path: "/profile", + name: "profile", + component: () => import("../views/user/ProfileView.vue"), + meta: { + title: "Profile", + }, + props: (route) => ({ + linkSuccess: route.query["link_success"], + linkError: route.query["link_error"], + }), + }, ]; diff --git a/src/stores/buckets.ts b/src/stores/buckets.ts index 9be03fc..5de6896 100644 --- a/src/stores/buckets.ts +++ b/src/stores/buckets.ts @@ -79,7 +79,6 @@ export const useBucketStore = defineStore("buckets", { ): Promise<BucketOut[]> { return BucketService.bucketListBuckets({ query: { owner_id: ownerId, bucket_type: bucketType }, - throwOnError: true, }) .then((response) => response.data!) .then((buckets) => { @@ -99,7 +98,6 @@ export const useBucketStore = defineStore("buckets", { } return BucketPermissionService.bucketPermissionListPermissionsPerUser({ path: { uid: authStore.currentUID }, - throwOnError: true, }) .then((response) => response.data!) .then((permissions) => { @@ -146,7 +144,6 @@ export const useBucketStore = defineStore("buckets", { } return BucketService.bucketGetBucket({ path: { bucket_name: bucketName }, - throwOnError: true, }) .then((response) => response.data!) .then((bucket) => { @@ -159,7 +156,6 @@ export const useBucketStore = defineStore("buckets", { return BucketService.bucketDeleteBucket({ path: { bucket_name: bucketName }, query: { force_delete: true }, - throwOnError: true, }) .then((response) => response.data!) .then(() => { @@ -169,7 +165,6 @@ export const useBucketStore = defineStore("buckets", { createBucket(bucket: BucketIn): Promise<BucketOut> { return BucketService.bucketCreateBucket({ body: bucket, - throwOnError: true, }) .then((response) => response.data!) .then((createdBucket) => { @@ -190,7 +185,6 @@ export const useBucketStore = defineStore("buckets", { } return BucketPermissionService.bucketPermissionListPermissionsPerBucket({ path: { bucket_name: bucketName }, - throwOnError: true, }) .then((response) => response.data!) .then((permissions) => { @@ -205,7 +199,6 @@ export const useBucketStore = defineStore("buckets", { bucket_name: bucketName, uid: uid, }, - throwOnError: true, }) .then((response) => response.data!) .then(() => { @@ -228,7 +221,6 @@ export const useBucketStore = defineStore("buckets", { ): Promise<BucketPermissionOut> { return BucketPermissionService.bucketPermissionCreatePermission({ body: permissionIn, - throwOnError: true, }) .then((response) => response.data!) .then((permission) => { @@ -255,7 +247,6 @@ export const useBucketStore = defineStore("buckets", { uid: uid, }, body: permissionParams, - throwOnError: true, }) .then((response) => response.data!) .then((permissionOut) => { @@ -284,7 +275,6 @@ export const useBucketStore = defineStore("buckets", { body: { public: public_, }, - throwOnError: true, }) ).data!; this.bucketMapping[bucketName] = bucket; @@ -301,13 +291,11 @@ export const useBucketStore = defineStore("buckets", { size_limit: size_limit, object_limit: object_limit, }, - throwOnError: true, }).then((response) => response.data!); }, acceptBucketOtr(otr: OwnershipTransferRequestOut): Promise<BucketOut> { return BucketService.bucketAcceptBucketOtr({ path: { bucket_name: otr.target_id }, - throwOnError: true, }) .then((response) => response.data!) .then((bucket) => { diff --git a/src/stores/news.ts b/src/stores/news.ts index df2758f..ccd8fed 100644 --- a/src/stores/news.ts +++ b/src/stores/news.ts @@ -21,7 +21,6 @@ export const useNewsStore = defineStore("news", { actions: { createNewsEvent(newsIn: NewsIn): Promise<NewsOut> { return NewsService.newsCreateNews({ - throwOnError: true, body: newsIn, }) .then((resp) => resp.data!) @@ -35,7 +34,6 @@ export const useNewsStore = defineStore("news", { return Promise.resolve(this.newsMapping[newsId]); } return NewsService.newsGetNews({ - throwOnError: true, path: { nid: newsId }, }) .then((resp) => resp.data!) @@ -49,7 +47,7 @@ export const useNewsStore = defineStore("news", { if (this.__loaded) { onFinally?.(); } - return NewsService.newsListLatestNews({ throwOnError: true }) + return NewsService.newsListLatestNews({}) .then((resp) => resp.data!) .then((news) => { useUserStore().fetchUsernames(news.map((event) => event.creator_id)); diff --git a/src/stores/otrs.ts b/src/stores/otrs.ts index f45f20d..6b6bfaf 100644 --- a/src/stores/otrs.ts +++ b/src/stores/otrs.ts @@ -63,7 +63,6 @@ export const useOTRStore = defineStore("otrs", { current_owner_id: currentOwnerId, new_owner_id: newOwnerId, }, - throwOnError: true, }; switch (targetType) { case OwnershipTypeEnum.BUCKET: @@ -144,17 +143,14 @@ export const useOTRStore = defineStore("otrs", { case OwnershipTypeEnum.BUCKET: return BucketService.bucketDeleteBucketOtr({ path: { bucket_name: otr.target_id }, - throwOnError: true, }); case OwnershipTypeEnum.WORKFLOW: return WorkflowService.workflowDeleteWorkflowOtr({ path: { wid: otr.target_id }, - throwOnError: true, }); case OwnershipTypeEnum.RESOURCE: return ResourceService.resourceDeleteResourceOtr({ path: { rid: otr.target_id }, - throwOnError: true, }); } })(); @@ -176,19 +172,16 @@ export const useOTRStore = defineStore("otrs", { return BucketService.bucketCreateBucketOtr({ path: { bucket_name: targetId }, body: otr, - throwOnError: true, }); case OwnershipTypeEnum.WORKFLOW: return WorkflowService.workflowCreateWorkflowOtr({ path: { wid: targetId }, body: otr, - throwOnError: true, }); case OwnershipTypeEnum.RESOURCE: return ResourceService.resourceCreateResourceOtr({ path: { rid: targetId }, body: otr, - throwOnError: true, }); } })(); diff --git a/src/stores/resources.ts b/src/stores/resources.ts index 56e6ecb..cb903a9 100644 --- a/src/stores/resources.ts +++ b/src/stores/resources.ts @@ -92,7 +92,6 @@ export const useResourceStore = defineStore("resources", { return ResourceService.resourceGetResource({ path: { rid: resource_id }, query: { version_status: versionStatus }, - throwOnError: true, }) .then((response) => response.data!) .then((resource) => { @@ -113,7 +112,7 @@ export const useResourceStore = defineStore("resources", { if (this.__syncRequestsFetched) { onFinally?.(); } - return ResourceService.resourceListSyncRequests({ throwOnError: true }) + return ResourceService.resourceListSyncRequests({}) .then((response) => response.data!) .then((requests) => { this.__syncRequestsFetched = true; @@ -143,7 +142,6 @@ export const useResourceStore = defineStore("resources", { name_substring: searchString, public: _public, }, - throwOnError: true, }) .then((response) => response.data!) .then((resources) => { @@ -177,7 +175,6 @@ export const useResourceStore = defineStore("resources", { rvid: resource_version_id, rid: resource_id, }, - throwOnError: true, }) .then((response) => response.data!) .then((tree) => { @@ -269,7 +266,6 @@ export const useResourceStore = defineStore("resources", { const createdResource = ( await ResourceService.resourceCreateResource({ body: resource, - throwOnError: true, }) ).data!; this.ownResourceMapping[createdResource.resource_id] = createdResource; @@ -295,7 +291,6 @@ export const useResourceStore = defineStore("resources", { rvid: resourceVersion.resource_version_id, }, body: request, - throwOnError: true, }) .then((response) => response.data!) .then((changedResourceVersion) => { @@ -338,7 +333,6 @@ export const useResourceStore = defineStore("resources", { rid: resourceVersion.resource_id, rvid: resourceVersion.resource_version_id, }, - throwOnError: true, }, ) .then((response) => response.data!) @@ -378,7 +372,6 @@ export const useResourceStore = defineStore("resources", { rid: resource_id, }, body: version, - throwOnError: true, }) .then((response) => response.data!) .then((versionOut) => { @@ -406,7 +399,6 @@ export const useResourceStore = defineStore("resources", { rvid: resourceVersion.resource_version_id, }, body: requestAnswer, - throwOnError: true, }) .then((response) => response.data!) .then(this._updateReviewableResourceVersion); @@ -421,7 +413,6 @@ export const useResourceStore = defineStore("resources", { rvid: resourceVersion.resource_version_id, }, body: requestAnswer, - throwOnError: true, }) .then((response) => response.data!) .then((version) => { @@ -459,7 +450,6 @@ export const useResourceStore = defineStore("resources", { rid: resourceVersion.resource_id, rvid: resourceVersion.resource_version_id, }, - throwOnError: true, }).then((response) => response.data!); }, deleteOnCluster( @@ -471,7 +461,6 @@ export const useResourceStore = defineStore("resources", { rid: resourceVersion.resource_id, rvid: resourceVersion.resource_version_id, }, - throwOnError: true, }, ).then((response) => response.data!); }, @@ -483,13 +472,11 @@ export const useResourceStore = defineStore("resources", { rid: resourceVersion.resource_id, rvid: resourceVersion.resource_version_id, }, - throwOnError: true, }).then((response) => response.data!); }, acceptResourceOtr(otr: OwnershipTransferRequestOut): Promise<ResourceOut> { return ResourceService.resourceAcceptResourceOtr({ path: { rid: otr.target_id }, - throwOnError: true, }) .then((response) => response.data!) .then((resource) => { diff --git a/src/stores/s3keys.ts b/src/stores/s3keys.ts index 83c8049..cbf9aab 100644 --- a/src/stores/s3keys.ts +++ b/src/stores/s3keys.ts @@ -28,7 +28,6 @@ export const useS3KeyStore = defineStore("s3keys", { } return S3KeyService.s3KeyGetUserKeys({ path: { uid: useUserStore().currentUID }, - throwOnError: true, }) .then((response) => response.data!) .then((keys) => { @@ -50,7 +49,6 @@ export const useS3KeyStore = defineStore("s3keys", { access_id: access_id, uid: userRepository.currentUID, }, - throwOnError: true, }) .then((response) => response.data!) .then(() => { @@ -63,7 +61,6 @@ export const useS3KeyStore = defineStore("s3keys", { const userRepository = useUserStore(); return S3KeyService.s3KeyCreateUserKey({ path: { uid: userRepository.currentUID }, - throwOnError: true, }) .then((response) => response.data!) .then((key) => { diff --git a/src/stores/users.ts b/src/stores/users.ts index 67eb1ca..c05c2e5 100644 --- a/src/stores/users.ts +++ b/src/stores/users.ts @@ -88,7 +88,7 @@ export const useUserStore = defineStore("user", { }, actions: { getCurrentUser(): Promise<UserOutExtended> { - return UserService.userGetLoggedInUser({ throwOnError: true }) + return UserService.userGetLoggedInUser({}) .then((response) => response.data!) .then((user) => { this.updateUser(user); @@ -128,7 +128,6 @@ export const useUserStore = defineStore("user", { name_substring: searchString, filter_roles: filterRoles, }, - throwOnError: true, }) .then((response) => response.data!) .then((users) => { @@ -148,7 +147,6 @@ export const useUserStore = defineStore("user", { } return ApiTokenService.apiTokenListToken({ query: { uid: uid }, - throwOnError: true, }) .then((response) => response.data!) .then((tokens) => { @@ -162,7 +160,6 @@ export const useUserStore = defineStore("user", { createApiToken(tokenIn: ApiTokenIn): Promise<ApiTokenPrivateOut> { return ApiTokenService.apiTokenCreateToken({ body: tokenIn, - throwOnError: true, }) .then((response) => response.data!) .then((token) => { @@ -173,7 +170,6 @@ export const useUserStore = defineStore("user", { deleteApiToken(tokenId: string): Promise<void> { return ApiTokenService.apiTokenDeleteToken({ path: { tid: tokenId }, - throwOnError: true, }) .then((response) => response.data!) .then(() => { @@ -186,11 +182,10 @@ export const useUserStore = defineStore("user", { body: { roles: roles, }, - throwOnError: true, }).then((response) => response.data!); }, inviteUser(userIn: UserIn): Promise<UserOutExtended> { - return UserService.userCreateUser({ body: userIn, throwOnError: true }) + return UserService.userCreateUser({ body: userIn }) .then((response) => response.data!) .then((user) => { useNameStore().addNameToMapping(user.uid, user.display_name); @@ -200,7 +195,6 @@ export const useUserStore = defineStore("user", { resendInvitationEmail(uid: string): Promise<UserOutExtended> { return UserService.userResendInvitation({ path: { uid: uid }, - throwOnError: true, }) .then((response) => response.data!) .then((user) => { @@ -211,7 +205,6 @@ export const useUserStore = defineStore("user", { searchUser(searchString: string): Promise<UserOut[]> { return UserService.userSearchUsers({ query: { name_substring: searchString }, - throwOnError: true, }) .then((response) => response.data!) .then((users) => { diff --git a/src/stores/workflowExecutions.ts b/src/stores/workflowExecutions.ts index 81444bb..112295d 100644 --- a/src/stores/workflowExecutions.ts +++ b/src/stores/workflowExecutions.ts @@ -124,7 +124,6 @@ export const useWorkflowExecutionStore = defineStore("executions", { const userStore = useUserStore(); return WorkflowService.workflowGetDeveloperWorkflowStatistics({ query: { developer_id: userStore.currentUID }, - throwOnError: true, }) .then((response) => response.data!) .then((executions) => { @@ -173,7 +172,6 @@ export const useWorkflowExecutionStore = defineStore("executions", { } return WorkflowExecutionService.workflowExecutionGetWorkflowExecution({ path: { eid: executionId }, - throwOnError: true, }) .then((response) => response.data!) .then((execution) => { @@ -196,7 +194,7 @@ export const useWorkflowExecutionStore = defineStore("executions", { return parameters; } return WorkflowExecutionService.workflowExecutionGetWorkflowExecutionParams( - { path: { eid: executionId }, throwOnError: true }, + { path: { eid: executionId } }, ) .then((response) => response.data!) .then((parameters) => { @@ -212,7 +210,6 @@ export const useWorkflowExecutionStore = defineStore("executions", { deleteExecution(executionId: string): Promise<void> { return WorkflowExecutionService.workflowExecutionDeleteWorkflowExecution({ path: { eid: executionId }, - throwOnError: true, }) .then((response) => response.data!) .then(() => { @@ -222,7 +219,6 @@ export const useWorkflowExecutionStore = defineStore("executions", { cancelExecution(executionId: string): Promise<void> { return WorkflowExecutionService.workflowExecutionCancelWorkflowExecution({ path: { eid: executionId }, - throwOnError: true, }) .then((response) => response.data!) .then(() => { @@ -240,7 +236,6 @@ export const useWorkflowExecutionStore = defineStore("executions", { ): Promise<WorkflowExecutionOut> { return WorkflowExecutionService.workflowExecutionStartWorkflow({ body: executionIn, - throwOnError: true, }) .then((response) => response.data!) .then((execution) => { @@ -253,7 +248,6 @@ export const useWorkflowExecutionStore = defineStore("executions", { ): Promise<WorkflowExecutionOut> { return WorkflowExecutionService.workflowExecutionStartArbitraryWorkflow({ body: executionIn, - throwOnError: true, }) .then((response) => response.data!) .then((execution) => { diff --git a/src/stores/workflows.ts b/src/stores/workflows.ts index 58e8d9a..2097d7b 100644 --- a/src/stores/workflows.ts +++ b/src/stores/workflows.ts @@ -1,9 +1,9 @@ import { defineStore } from "pinia"; import type { - Body_Workflow_Version_upload_workflow_version_icon, + BodyWorkflowVersionUploadWorkflowVersionIcon, IconUpdateOut, OwnershipTransferRequestOut, - ParameterExtension_Output, + ParameterExtensionOutput, WorkflowCredentialsIn, WorkflowIn, WorkflowModeOut, @@ -101,7 +101,6 @@ export const useWorkflowStore = defineStore("workflows", { wid: workflowId, git_commit_hash: versionId, }, - throwOnError: true, }).then((response) => response.data!); }, updateVersionMetadata( @@ -116,7 +115,6 @@ export const useWorkflowStore = defineStore("workflows", { git_commit_hash: versionId, }, body: metadata, - throwOnError: true, }, ).then((response) => response.data!); }, @@ -124,7 +122,7 @@ export const useWorkflowStore = defineStore("workflows", { if (Object.keys(this.publicWorkflowMapping).length > 0) { onFinally?.(); } - return PublicService.publicGetPublicWorkflows({ throwOnError: true }) + return PublicService.publicGetPublicWorkflows({}) .then((response) => response.data!) .then((workflows) => { const tempMapping: IdMapping<PublicWorkflowOut> = {}; @@ -140,7 +138,7 @@ export const useWorkflowStore = defineStore("workflows", { if (Object.keys(this.workflowMapping).length > 0) { onFinally?.(); } - return WorkflowService.workflowListWorkflows({ throwOnError: true }) + return WorkflowService.workflowListWorkflows({}) .then((response) => response.data!) .then((workflows) => { for (const workflow of workflows) { @@ -174,7 +172,6 @@ export const useWorkflowStore = defineStore("workflows", { version_status: Object.values(WorkflowVersionStatus), developer_id: authStore.currentUID, }, - throwOnError: true, }) .then((response) => response.data!) .then((workflows) => { @@ -235,7 +232,6 @@ export const useWorkflowStore = defineStore("workflows", { document: document, mode_id: mode_id, }, - throwOnError: true, }, ) .then((response) => response.data!) @@ -260,7 +256,6 @@ export const useWorkflowStore = defineStore("workflows", { query: { version_status: [WorkflowVersionStatus.CREATED], }, - throwOnError: true, }) .then((response) => response.data!) .then((workflows) => { @@ -325,7 +320,6 @@ export const useWorkflowStore = defineStore("workflows", { ? Object.values(WorkflowVersionStatus) : undefined, }, - throwOnError: true, }) .then((response) => response.data!) .then((workflow) => { @@ -393,7 +387,6 @@ export const useWorkflowStore = defineStore("workflows", { wid: workflow_id, git_commit_hash: version_id, }, - throwOnError: true, }) .then((response) => response.data!) .then((version) => { @@ -443,7 +436,6 @@ export const useWorkflowStore = defineStore("workflows", { return WorkflowService.workflowUpdateWorkflow({ path: { wid: workflow_id }, body: version, - throwOnError: true, }) .then((response) => response.data!) .then((updatedVersion) => { @@ -464,7 +456,6 @@ export const useWorkflowStore = defineStore("workflows", { deleteWorkflow(workflow_id: string): Promise<void> { return WorkflowService.workflowDeleteWorkflow({ path: { wid: workflow_id }, - throwOnError: true, }) .then((response) => response.data!) .then(() => { @@ -476,7 +467,6 @@ export const useWorkflowStore = defineStore("workflows", { createWorkflow(workflow: WorkflowIn): Promise<WorkflowOut> { return WorkflowService.workflowCreateWorkflow({ body: workflow, - throwOnError: true, }) .then((response) => response.data!) .then((workflowOut) => { @@ -498,7 +488,6 @@ export const useWorkflowStore = defineStore("workflows", { { path: { wid: workflow_id }, body: credentials, - throwOnError: true, }, ) .then((response) => response.data!) @@ -517,7 +506,7 @@ export const useWorkflowStore = defineStore("workflows", { }, deleteWorkflowCredentials(workflow_id: string): Promise<void> { return WorkflowCredentialsService.workflowCredentialsDeleteWorkflowCredentials( - { path: { wid: workflow_id }, throwOnError: true }, + { path: { wid: workflow_id } }, ) .then((response) => response.data!) .then(() => { @@ -536,7 +525,7 @@ export const useWorkflowStore = defineStore("workflows", { updateVersionIcon( workflow_id: string, version_id: string, - icon: Body_Workflow_Version_upload_workflow_version_icon, + icon: BodyWorkflowVersionUploadWorkflowVersionIcon, ): Promise<IconUpdateOut> { return WorkflowVersionService.workflowVersionUploadWorkflowVersionIcon({ path: { @@ -544,7 +533,6 @@ export const useWorkflowStore = defineStore("workflows", { git_commit_hash: version_id, }, body: icon, - throwOnError: true, }) .then((response) => response.data!) .then((response) => { @@ -590,7 +578,6 @@ export const useWorkflowStore = defineStore("workflows", { wid: workflow_id, git_commit_hash: version_id, }, - throwOnError: true, }) .then((response) => response.data!) .then(() => { @@ -638,7 +625,6 @@ export const useWorkflowStore = defineStore("workflows", { git_commit_hash: version_id, }, body: { status: status }, - throwOnError: true, }) .then((response) => response.data!) .then(() => { @@ -661,7 +647,7 @@ export const useWorkflowStore = defineStore("workflows", { updateWorkflowExtension( workflow_id: string, version_id: string, - extension: ParameterExtension_Output, + extension: ParameterExtensionOutput, ): Promise<WorkflowVersionOut> { return WorkflowVersionService.workflowVersionUpdateWorkflowVersionParameterExtension( { @@ -670,7 +656,6 @@ export const useWorkflowStore = defineStore("workflows", { git_commit_hash: version_id, }, body: extension, - throwOnError: true, }, ) .then((response) => response.data!) @@ -723,7 +708,6 @@ export const useWorkflowStore = defineStore("workflows", { this.versionMapping[version_id]?.parameter_extension ?.parameter_visibility, }, - throwOnError: true, }, ) .then((response) => response.data!) @@ -763,7 +747,6 @@ export const useWorkflowStore = defineStore("workflows", { acceptWorkflowOtr(otr: OwnershipTransferRequestOut): Promise<WorkflowOut> { return WorkflowService.workflowAcceptWorkflowOtr({ path: { wid: otr.target_id }, - throwOnError: true, }) .then((response) => response.data!) .then((workflow) => { diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue index 6126a77..cf841ae 100644 --- a/src/views/LoginView.vue +++ b/src/views/LoginView.vue @@ -1,10 +1,15 @@ <script setup lang="ts"> -import { onBeforeMount, onMounted, computed } from "vue"; +import { onBeforeMount, onMounted } from "vue"; import { useUserStore } from "@/stores/users"; import { useRouter } from "vue-router"; import { Toast } from "bootstrap"; import BootstrapToast from "@/components/BootstrapToast.vue"; -import { environment } from "@/environment"; +import { + type AuthKickstartLoginData, + OidcProvider, +} from "@/client/types.gen.ts"; +import { client } from "@/client/client.gen.ts"; +import { environment } from "@/environment.ts"; const router = useRouter(); @@ -25,18 +30,23 @@ onBeforeMount(() => { } }); -const loginPath = computed<string>(() => { - const loginUrl = new URL( - `${environment.API_BASE_URL}/auth/login?provider=lifescience`, +function loginPath(provider: OidcProvider): string { + const config: AuthKickstartLoginData = { + url: "/auth/login/{provider}", + path: { + provider: provider, + }, + query: { + next: + props.returnPath != undefined ? encodeURI(props.returnPath) : undefined, + invitation_token: + props.invitationToken != undefined ? props.invitationToken : undefined, + }, + }; + return ( + environment.API_BASE_URL + client.buildUrl<AuthKickstartLoginData>(config) ); - if (props.returnPath) { - loginUrl.searchParams.append("next", encodeURI(props.returnPath)); - } - if (props.invitationToken) { - loginUrl.searchParams.append("invitation_token", props.invitationToken); - } - return loginUrl.href; -}); +} onMounted(() => { errorToast = new Toast("#loginErrorToast"); @@ -90,14 +100,24 @@ onMounted(() => { ><span class="clowm-red fw-bold">W</span ><span class="clowm-green fw-bold">M</span> with LifeScience </p> - <a :href="loginPath" class="my-2"> - <img - src="/src/assets/images/ls-login.png" - alt="[LS Login]" - class="img-fluid" - style="max-height: 90px" - /> - </a> + <div> + <a :href="loginPath(OidcProvider.LIFESCIENCE_AAI)" class="my-2"> + <img + src="/src/assets/images/ls-login.png" + alt="[LS Login]" + class="img-fluid" + style="max-height: 90px" + /> + </a> + </div> + <div> + <a + :href="loginPath(OidcProvider.NFDI_AAI)" + class="my-2 btn btn-lg btn-primary" + > + NFDI AAI + </a> + </div> <div v-if="invitationToken == undefined" class="mt-2"> Don't have an account? <router-link :to="{ name: 'signup' }"> diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue new file mode 100644 index 0000000..2fc7156 --- /dev/null +++ b/src/views/user/ProfileView.vue @@ -0,0 +1,7 @@ +<script setup lang="ts"></script> + +<template> + <div>My Profile</div> +</template> + +<style scoped></style> diff --git a/src/views/workflows/CreateParameterTranslationView.vue b/src/views/workflows/CreateParameterTranslationView.vue index 62d306f..e22bc1a 100644 --- a/src/views/workflows/CreateParameterTranslationView.vue +++ b/src/views/workflows/CreateParameterTranslationView.vue @@ -4,7 +4,7 @@ import { useWorkflowStore } from "@/stores/workflows"; import { computed, onMounted, reactive, ref, watch } from "vue"; import { DocumentationEnum, - type ParameterExtension_Output, + type ParameterExtensionOutput, } from "@/client/types.gen"; import type { ClowmInfo } from "@/types/ClowmInfo"; import ParameterInput from "@/components/parameter-schema/form-mode/ParameterInput.vue"; @@ -35,7 +35,7 @@ const workflowRepository = useWorkflowStore(); const parameterState = reactive<{ loading: boolean; makingRequest: boolean; - extension: ParameterExtension_Output; + extension: ParameterExtensionOutput; resourceParametersDefault: Set<string>; resourceParametersMapping: Set<string>; mappingParameterValues: Record<string, string>; diff --git a/src/views/workflows/MyWorkflowsView.vue b/src/views/workflows/MyWorkflowsView.vue index c5fccc7..bf20bdc 100644 --- a/src/views/workflows/MyWorkflowsView.vue +++ b/src/views/workflows/MyWorkflowsView.vue @@ -70,7 +70,7 @@ const workflowsState = reactive<{ workflow_id: "", icon_url: "", modes: [], - nextflow_version: NextflowVersion._24_04_2, + nextflow_version: NextflowVersion["24_04_2"], }, ], repository_url: "", @@ -86,7 +86,7 @@ const workflowsState = reactive<{ icon_url: null, created_at: 0, status: WorkflowVersionStatus.CREATED, - nextflow_version: NextflowVersion._24_04_2, + nextflow_version: NextflowVersion["24_04_2"], }, }); diff --git a/src/views/workflows/StartWorkflowView.vue b/src/views/workflows/StartWorkflowView.vue index fa0d782..4c04457 100644 --- a/src/views/workflows/StartWorkflowView.vue +++ b/src/views/workflows/StartWorkflowView.vue @@ -124,7 +124,7 @@ onMounted(() => { allow-notes :nextflow-version=" workflowRepository.versionMapping[versionId]?.nextflow_version ?? - NextflowVersion._24_04_2 + NextflowVersion['24_04_2'] " :clowm-info=" workflowRepository.documentationFiles[versionId]?.[ diff --git a/src/views/workflows/UpdateWorkflowVersionMetadata.vue b/src/views/workflows/UpdateWorkflowVersionMetadata.vue index 6cfff7b..ebfd333 100644 --- a/src/views/workflows/UpdateWorkflowVersionMetadata.vue +++ b/src/views/workflows/UpdateWorkflowVersionMetadata.vue @@ -17,7 +17,7 @@ const props = defineProps<{ const metadata = reactive<WorkflowVersionMetadataIn>({ default_container: undefined, - nextflow_version: NextflowVersion._22_10_0, + nextflow_version: NextflowVersion["22_10_0"], nextflow_config: undefined, }); diff --git a/vite.config.ts b/vite.config.ts index 805d563..0f089af 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -6,6 +6,14 @@ import vue from "@vitejs/plugin-vue"; // https://vitejs.dev/config/ export default defineConfig({ + server: { + allowedHosts: [".clowm.de"], + strictPort: true, + }, + preview: { + allowedHosts: [".clowm.de"], + strictPort: true, + }, plugins: [ vue(), nodePolyfills({ -- GitLab From 198000ce5c869e3894a3eae0ffa88ae4cfe0f49e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Mon, 10 Feb 2025 10:17:06 +0000 Subject: [PATCH 02/25] Add profile page * Add button to delete current user account * Fix bug when downloading multiple files #191 --- openapi-clowm.json | 2 +- package-lock.json | 237 +++++++++--------- package.json | 8 +- src/client/sdk.gen.ts | 5 + src/client/types.gen.ts | 2 +- src/components/modals/DeleteUserModal.vue | 109 ++++++++ .../modals/DownloadObjectsModal.vue | 8 +- src/stores/users.ts | 6 + src/views/user/ProfileView.vue | 65 ++++- 9 files changed, 320 insertions(+), 122 deletions(-) create mode 100644 src/components/modals/DeleteUserModal.vue diff --git a/openapi-clowm.json b/openapi-clowm.json index 1dfafd3..262eef4 100644 --- a/openapi-clowm.json +++ b/openapi-clowm.json @@ -1 +1 @@ -{"openapi":"3.1.0","info":{"title":"CloWM UI API","description":"This is the API for the CloWM UI. It is only for internal use and will change without prior notice.","version":"1.0"},"servers":[{"url":"/api"}],"paths":{"/auth/login/{provider}":{"get":{"tags":["Auth"],"summary":"Kickstart the login flow","description":"Redirect route to OIDC provider to kickstart the login process.","operationId":"Auth-kickstart_login","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider","description":"The OIDC provider to use for login"},"description":"The OIDC provider to use for login"},{"name":"invitation_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":43,"maxLength":43},{"type":"null"}],"description":"Unique token to validate an invitation","title":"Invitation Token"},"description":"Unique token to validate an invitation"},{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Will be appended to redirect response in the callback route as URL query parameter `next`","title":"Next"},"description":"Will be appended to redirect response in the callback route as URL query parameter `next`"}],"responses":{"302":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login/callback/{provider}":{"get":{"tags":["Auth"],"summary":"LifeScience Login Callback","description":"Callback for the login process with an OIDC Provider.\n\nVisit the route login route to start the login process.\n\nIf the user is already known to the system, then a JWT token will be created and sent via the 'set-cookie' header.\nThe key for this Cookie is 'bearer'.\n\nIf the user is new, he will be created him and then a JWT token is issued.\n\nThis JWT has to be sent to all authorized endpoints via the HTTPBearer scheme.","operationId":"Auth-login_callback","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider"}}],"responses":{"302":{"description":"Successful Response","headers":{"Set-Cookie":{"description":"JWT for accessing the API","schema":{"type":"string","example":"clowm-jwt=fake-jwt-cookie; Domain=localhost; Max-Age=691200; Path=/; SameSite=strict; Secure"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/account/connect/{provider}":{"get":{"tags":["Auth"],"summary":"Kickstart the account connection flow","description":"Redirect route to OIDC provider to connect the CloWM account with the AAI account.","operationId":"Auth-kickstart_account_connection","security":[{"Session Token":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider","description":"The OIDC provider to use for login"},"description":"The OIDC provider to use for login"}],"responses":{"302":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/account/callback/{provider}":{"get":{"tags":["Auth"],"summary":"LifeScience Login Callback","description":"Callback for the account connection process with an OIDC provider.","operationId":"Auth-account_connection_callback","security":[{"Session Token":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider"}}],"responses":{"302":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"get":{"tags":["Auth"],"summary":"Logout","description":"Logout the user from the system by deleting the bearer cookie.","operationId":"Auth-logout","responses":{"302":{"description":"Successful Response","headers":{"Set-Cookie":{"description":"JWT for accessing the API","schema":{"type":"string","example":"clowm-jwt=; Domain=localhost; Max-Age=0; Path=/; SameSite=strict; Secure"}}}}}}},"/ui/tokens":{"get":{"tags":["APIToken"],"summary":"List API token","description":"List meta information about all API token.\n\nPermissions `api_token:list_all` required. See parameter `uid` for exception.","operationId":"APIToken-list_token","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiTokenOut"},"title":"Response Apitoken-List Token"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["APIToken"],"summary":"Create new API token","description":"Create a new API token for the current user.\n\nPermission `api_token:create` required.","operationId":"APIToken-create_token","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenIn","description":"Meta-data for Api token to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenPrivateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/tokens/{tid}":{"get":{"tags":["APIToken"],"summary":"Get API token","description":"Get an API token by id.\n\nPermission `api_token:read` required if the current user is the owner of the API token,\notherwise `api_token:read_any` required.","operationId":"APIToken-get_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["APIToken"],"summary":"Delete API token","description":"Delete an API token by id.\n\nPermission `api_token:delete` required if the current user is the owner of the API token,\notherwise `api_token:delete_any` required.","operationId":"APIToken-delete_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users":{"post":{"tags":["User"],"summary":"Create User","description":"Create a new user in the system and notify him.\n\nPermission `user:create` required.","operationId":"User-create_user","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserIn","description":"Meta-data for user to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["User"],"summary":"List users and search by their name","description":"List all users in the system..\n\nPermission `user:list` required.","operationId":"User-list_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter users by a substring in their name.","examples":["Bilbo"],"title":"Name Substring"},"description":"Filter users by a substring in their name."},{"name":"filter_roles","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/RoleEnum"}},{"type":"null"}],"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression.","title":"Filter Roles"},"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOutExtended"},"title":"Response User-List Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/search":{"get":{"tags":["User"],"summary":"Search Users","description":"Search for users in the system by their name.\n\nPermission `user: search` required.","operationId":"User-search_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":30,"description":"Filter users by a substring in their name.","title":"Name Substring"},"description":"Filter users by a substring in their name."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOut"},"title":"Response User-Search Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/me":{"get":{"tags":["User"],"summary":"Get the logged in user","description":"Return the user associated with the used JWT.\n\nPermission `user:read` required.","operationId":"User-get_logged_in_user","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}}},"security":[{"Session Token":[]}]}},"/ui/users/{uid}":{"get":{"tags":["User"],"summary":"Get a user by its uid","description":"Return the user with the specific uid.\n\nPermission `user:read` required.","operationId":"User-get_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["User"],"summary":"Delete a user","description":"Delete a user and his S3 account.\n\nPermission `user:delete` required if the current user is the target user.","operationId":"User-delete_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/roles":{"put":{"tags":["User"],"summary":"Update user roles","description":"Update the roles of a user.\n\nPermission `user:update` required.","operationId":"User-update_roles","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRoles","description":"The new roles of the user"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/invitation":{"patch":{"tags":["User"],"summary":"Resend Invitation","description":"Resend the invitation link for an user that has an open invitation.\n\nPermission `user:create` required.","operationId":"User-resend_invitation","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys":{"get":{"tags":["S3Key"],"summary":"Get the S3 Access keys from a user","description":"Get all the S3 Access keys for a specific user.\n\nPermission `s3_key:list` required if the current user is the target, otherwise `s3_key:list_all` required.","operationId":"S3Key-get_user_keys","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/S3Key"},"title":"Response S3Key-Get User Keys"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["S3Key"],"summary":"Create a Access key for a user","description":"Create a S3 Access key for a specific user.\n\nPermission `s3_key:create` required if the current user is the target, otherwise `s3_key:create_any` required.","operationId":"S3Key-create_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys/{access_id}":{"get":{"tags":["S3Key"],"summary":"Get a specific S3 Access key from a user","description":"Get a specific S3 Access Key for a specific user.\n\nPermission `s3_key:read` required if the current user is the target, otherwise `s3_key:read_any` required.","operationId":"S3Key-get_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["S3Key"],"summary":"Delete a specific S3 Access key from a user","description":"Delete a specific S3 Access key for a specific user.\n\nPermission `s3_key:delete` required if the current user is the target, otherwise `s3_key:delete_any` required.","operationId":"S3Key-delete_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets":{"get":{"tags":["Bucket"],"summary":"List buckets","description":"List all the buckets in the system or of the desired user where the user has permissions for.\n\nPermission `bucket:list_all` required. See parameter `owner_id` for exception.","operationId":"Bucket-list_buckets","security":[{"Session Token":[]}],"parameters":[{"name":"owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Owner Id"},"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target."},{"name":"bucket_type","in":"query","required":false,"schema":{"$ref":"#/components/schemas/BucketType","description":"Type of the bucket to get. Ignored when `user` parameter not set","default":"ALL"},"description":"Type of the bucket to get. Ignored when `user` parameter not set"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketOut"},"title":"Response Bucket-List Buckets"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket for the current user","description":"Create a bucket for the current user.\n\nThe name of the bucket has some constraints.\nFor more information see the\n[Ceph documentation](https://docs.ceph.com/en/quincy/radosgw/s3/bucketops/#constraints)\n\nPermission `bucket:create` required.","operationId":"Bucket-create_bucket","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketIn","description":"Meta-data for bucket to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"List bucket OTRs","description":"Get the ownership transfer requests for buckets.\n\nPermission `bucket:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `bucket:list_all`","operationId":"Bucket-list_bucket_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Bucket-List Bucket Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}":{"get":{"tags":["Bucket"],"summary":"Get a bucket by its name","description":"Get a bucket by its name if the current user has READ permissions for the bucket.\n\nPermission `bucket:read` required if the current user is the owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket","description":"Delete a bucket by its name. Only the owner of the bucket can delete the bucket.\n\nPermission `bucket:delete` required if the current user is the owner of the bucket,\notherwise `bucket:delete_any` required.","operationId":"Bucket-delete_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"force_delete","in":"query","required":false,"schema":{"type":"boolean","description":"Delete even non-empty bucket","default":false,"title":"Force Delete"},"description":"Delete even non-empty bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"Get a bucket OTR","description":"Get a specific bucket ownership transfer request.\n\nPermission `bucket:read` required if the current user is the current or new owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket OTR","description":"Create a ownership transfer request for a specific bucket.\n\nPermission `bucket:update` required if the current user is the current owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-create_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the bucket OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Bucket"],"summary":"Accept a bucket OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `bucket:update` required if the current user is the new owner of the workflow,\notherwise `bucket:update_any` required.","operationId":"Bucket-accept_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket OTR","description":"Delete/Reject a bucket ownership transfer request.\n\nPermission `bucket:update` required if the current user is the current or new owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-delete_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/public":{"patch":{"tags":["Bucket"],"summary":"Update public status","description":"Update the buckets public state.\n\nPermission `bucket:update` required if the current user is the owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-update_bucket_public_state","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_Bucket-update_bucket_public_state"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/limits":{"patch":{"tags":["Bucket"],"summary":"Update bucket limits","description":"Update the buckets size limits.\n\nPermission `bucket:update_any` required.","operationId":"Bucket-update_bucket_limits","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketSizeLimits","description":"New size limits for bucket"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions.","description":"List all the bucket permissions in the system.\n\nPermission `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions","security":[{"Session Token":[]}],"parameters":[{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["BucketPermission"],"summary":"Create a permission.","description":"Create a permission for a bucket and user.\n\nPermission `bucket_permission:create` required.","operationId":"BucketPermission-create_permission","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionIn","description":"Permission to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a user.","description":"List all the bucket permissions for the given user.\n\nPermission `bucket_permission:list` required if current user is the target the bucket permission,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per User"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a bucket.","description":"List all the bucket permissions for the given bucket.\n\nPermission `bucket_permission:list` required if current user is owner of the bucket,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per Bucket"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get permission for bucket and user combination.","description":"Get the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:read` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:read_any` required.","operationId":"BucketPermission-get_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["BucketPermission"],"summary":"Update a bucket permission","description":"Update a permission for a bucket and user.\n\nPermission `bucket_permission:update` required.","operationId":"BucketPermission-update_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionParameters","description":"Permission to create"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["BucketPermission"],"summary":"Delete a bucket permission","description":"Delete the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:delete` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:delete_any` required.","operationId":"BucketPermission-delete_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows":{"post":{"tags":["Workflow"],"summary":"Create a new workflow","description":"Create a new workflow.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow-create_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowIn","description":"Meta-date for the workflow to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow"],"summary":"List workflows","description":"List all workflows.\n\nPermission `workflow:list` required.","operationId":"Workflow-list_workflows","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter workflows by a substring in their name.","examples":["blast"],"title":"Name Substring"},"description":"Filter workflows by a substring in their name."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`.","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`."},{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowOut"},"title":"Response Workflow-List Workflows"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"List workflow OTRs","description":"Get the ownership transfer requests for workflows.\n\nPermission `workflow:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `workflow:list_all`","operationId":"Workflow-list_workflow_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Workflow-List Workflow Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/developer_statistics":{"get":{"tags":["Workflow"],"summary":"Get anonymized workflow execution","description":"Get the workflow executions with meta information and anonymized user IDs.\n\nPermission `workflow:read` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:read_any`.","operationId":"Workflow-get_developer_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter by the developer of the workflows","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter by the developer of the workflows"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"description":"Filter by workflow IDs","title":"Workflow Id"},"description":"Filter by workflow IDs"},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions after this date","title":"Start"},"description":"Filter by workflow executions after this date"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions before this date","title":"End"},"description":"Filter by workflow executions before this date"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnonymizedWorkflowExecution"},"title":"Response Workflow-Get Developer Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}":{"get":{"tags":["Workflow"],"summary":"Get a workflow","description":"Get a specific workflow.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow","description":"Delete a workflow.\n\nPermission `workflow:delete` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:delete_any`.","operationId":"Workflow-delete_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"Get a workflow OTR","description":"Get a specific workflow ownership transfer request.\n\nPermission `workflow:read` required if current user is the current or new owner of the workflow,\notherwise `workflow:read_any` required.","operationId":"Workflow-get_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Workflow"],"summary":"Create a workflow OTR","description":"Create a ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the current owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-create_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for workflow OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Workflow"],"summary":"Accept a workflow OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-accept_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow OTR","description":"Delete/Reject a workflow ownership transfer request.\n\nPermission `workflow:update` required if current user is the current or new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-delete_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/statistics":{"get":{"tags":["Workflow"],"summary":"Get statistics for a workflow","description":"Get the number of started workflow per day.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowStatistic"},"title":"Response Workflow-Get Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/update":{"post":{"tags":["Workflow"],"summary":"Update a workflow","description":"Create a new workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow-update_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdate","description":"Meta-data for the workflow version to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions":{"get":{"tags":["Workflow Version"],"summary":"Get all versions of a workflow","description":"List all versions of a Workflow.\n\nPermission `workflow:list` required.","operationId":"Workflow Version-list_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"title":"Response Workflow Version-List Workflow Version"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}":{"get":{"tags":["Workflow Version"],"summary":"Get a workflow version","description":"Get a specific version of a workflow.\n\nPermission `workflow:read` required if the version is public or you are the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit `git_commit_hash` of specific version or `latest`.","examples":["latest","ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit `git_commit_hash` of specific version or `latest`."},{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/status":{"patch":{"tags":["Workflow Version"],"summary":"Update status of workflow version","description":"Update the status of a workflow version.\n\nPermission `workflow:update_status`","operationId":"Workflow Version-update_workflow_version_status","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionStatusSchema","description":"New Status of the workflow version"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/metadata":{"get":{"tags":["Workflow Version"],"summary":"Get metadata of workflow version","description":"Get the metadata of a workflow version.\n\nPermission `workflow:read` required if the current user is the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Version"],"summary":"Update metadata of workflow version","description":"Update the metadata of a workflow version.\n\nPermission `workflow:update` required if the current user is the developer of the workflow,\notherwise `workflow:update_any`","operationId":"Workflow Version-update_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/deprecate":{"patch":{"tags":["Workflow Version"],"summary":"Deprecate a workflow version","description":"Deprecate a workflow version.\n\nPermission `workflow:update` required if you are the developer of the workflow,\notherwise `workflow:update_status`","operationId":"Workflow Version-deprecate_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/parameter-extension":{"patch":{"tags":["Workflow Version"],"summary":"Update parameter extension of workflow version","description":"Update the parameter extension of a workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-update_workflow_version_parameter_extension","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParameterExtension-Input","description":"Parameter extension specific for this CloWM instance"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/documentation":{"get":{"tags":["Workflow Version"],"summary":"Fetch documentation for a workflow version","description":"Get the documentation for a specific workflow version.\nStreams the response directly from the right git repository.\n\nPermission `workflow:read` required.","operationId":"Workflow Version-download_workflow_documentation","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."},{"name":"document","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DocumentationEnum","description":"Specify which type of documentation the client wants to fetch","default":"usage.md"},"description":"Specify which type of documentation the client wants to fetch"},{"name":"mode_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Workflow Mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"Workflow Mode"}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/icon":{"post":{"tags":["Workflow Version"],"summary":"Upload icon for workflow version","description":"Upload an icon for the workflow version and returns the new icon URL.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-upload_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_Workflow_Version-upload_workflow_version_icon"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IconUpdateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Version"],"summary":"Delete icon of workflow version","description":"Delete the icon of the workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-delete_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions":{"post":{"tags":["Workflow Execution"],"summary":"Start a new workflow execution","description":"Start a new workflow execution. Workflow versions wit status `DEPRECATED` or `DENIED` can't be started.\n\nPermission `workflow_execution:create` required if workflow versions status is `PUBLISHED`,\notherwise `workflow_execution:create_any` required.","operationId":"Workflow Execution-start_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow Execution"],"summary":"List all workflow executions","description":"Get all workflow executions.\n\nThis endpoint enforces keyset pagination. To iterate over all workflow executions, follow the link provided in the\n`Link` header.\nA missing `Link` header indicates that you iterated over all workflow executions with the current filters.\n\nPermission `workflow_execution:list` required, if `executor_id` is the same as the current user,\notherwise `workflow_execution:list_all` required.","operationId":"Workflow Execution-list_workflow_executions","security":[{"Session Token":[]}],"parameters":[{"name":"executor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Executor Id"},"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required."},{"name":"execution_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionStatus"}},{"type":"null"}],"description":"Filter for status of workflow execution","title":"Execution Status"},"description":"Filter for status of workflow execution"},{"name":"workflow_version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":40,"maxLength":40,"pattern":"^[0-9a-f]+$"},{"type":"null"}],"description":"Filter for workflow version","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Workflow Version Id"},"description":"Filter for workflow version"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Workflow Id"},"description":"Filter for workflow"},{"name":"start_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started after this UNIX timestamp","examples":[1640991600],"title":"Start After"},"description":"Filter for workflow executions that started after this UNIX timestamp"},{"name":"start_before","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started before this UNIX timestamp","examples":[1640991600],"title":"Start Before"},"description":"Filter for workflow executions that started before this UNIX timestamp"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionOut"},"title":"Response Workflow Execution-List Workflow Executions"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<https://dev.clowm.de/api/workflow_executions?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/arbitrary":{"post":{"tags":["Workflow Execution"],"summary":"Start a workflow execution with arbitrary git repository","description":"Start a new workflow execution from an arbitrary git repository.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow Execution-start_arbitrary_workflow","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevWorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Session Token":[]}]}},"/ui/workflow_executions/{eid}":{"get":{"tags":["Workflow Execution"],"summary":"Get a workflow execution","description":"Get a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Execution"],"summary":"Delete a workflow execution","description":"Delete a specific workflow execution.\n\nPermission `workflow_execution:delete` required if the current user started the workflow execution,\notherwise `workflow_execution:delete_any` required.","operationId":"Workflow Execution-delete_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/params":{"get":{"tags":["Workflow Execution"],"summary":"Get the parameters of a workflow execution","description":"Get the parameters of a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution_params","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Workflow Execution-Get Workflow Execution Params"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/cancel":{"post":{"tags":["Workflow Execution"],"summary":"Cancel a workflow execution","description":"Cancel a running workflow execution.\n\nPermission `workflow_execution:cancel` required if the current user started the workflow execution,\notherwise `workflow_execution:cancel_any` required.","operationId":"Workflow Execution-cancel_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/credentials":{"get":{"tags":["Workflow Credentials"],"summary":"Get the credentials of a workflow","description":"Get the credentials for the repository of a workflow. Only the developer of a workflow can do this.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-get_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Credentials"],"summary":"Update the credentials of a workflow","description":"Update the credentials for the repository of a workflow.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-update_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsIn","description":"Updated credentials for the workflow git repository"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Credentials"],"summary":"Delete the credentials of a workflow","description":"Delete the credentials for the repository of a workflow.\n\nPermission `workflow:delete` required if the developer of the workflow is the same as the current user,\nother `workflow:delete_any`.","operationId":"Workflow Credentials-delete_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_modes/{mode_id}":{"get":{"tags":["Workflow Mode"],"summary":"Get workflow mode","description":"Get a workflow mode.\n\nPermission `workflow:read` required","operationId":"Workflow Mode-get_workflow_mode","security":[{"Session Token":[]}],"parameters":[{"name":"mode_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"ID of a workflow mode"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowModeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources":{"post":{"tags":["Resource"],"summary":"Request a new resource","description":"Request a new resources.\n\nPermission `resource:create` required.","operationId":"Resource-create_resource","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceIn","description":"Meta-data for the resource to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Resource"],"summary":"List resources","description":"List all resources.\n\nPermission `resource:list` required.","operationId":"Resource-list_resources","security":[{"Session Token":[]}],"parameters":[{"name":"maintainer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Maintainer Id"},"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required."},{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"description":"Filter resources by a substring in their name.","examples":["gtdb"],"title":"Name Substring"},"description":"Filter resources by a substring in their name."},{"name":"public","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter resources to by the public flag","title":"Public"},"description":"Filter resources to by the public flag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceOut"},"title":"Response Resource-List Resources"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/sync_requests":{"get":{"tags":["Resource"],"summary":"List resource sync requests","description":"List all resource sync requests.\n\nPermission `resource:update_any` required.","operationId":"Resource-list_sync_requests","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UserSynchronizationRequestOut"},"type":"array","title":"Response Resource-List Sync Requests"}}}}},"security":[{"Session Token":[]}]}},"/ui/resources/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"List resource OTRs","description":"Get the ownership transfer requests for resources.\n\nPermission `resource:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `resource:list_all`","operationId":"Resource-list_resource_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Resource-List Resource Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}":{"get":{"tags":["Resource"],"summary":"Get a resource","description":"Get a specific resource.\n\nPermission `resource:read` required.","operationId":"Resource-get_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource","description":"Delete a resources.\n\nPermission `resource:delete` required.","operationId":"Resource-delete_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"Get a resource OTR","description":"Get a specific resource ownership transfer request.\n\nPermission `resource:read` required if the current user is the current or new owner of the resource,\notherwise `resource:read_any` required.","operationId":"Resource-get_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Resource"],"summary":"Create a resource OTR","description":"Create a ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the current owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-create_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the resource OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Resource"],"summary":"Accept a resource OTR","description":"Accept an ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-accept_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource OTR","description":"Delete/Reject a resource ownership transfer request.\n\nPermission `resource:update` required if the current user is the current or new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-delete_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions":{"get":{"tags":["ResourceVersion"],"summary":"List versions of a resource","description":"List all the resource version for a specific resource.\n\nPermission 'resource:read' required.","operationId":"ResourceVersion-list_resource_versions","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionOut"},"title":"Response Resourceversion-List Resource Versions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["ResourceVersion"],"summary":"Request new version of a resource","description":"Request a new resource version.\n\nPermission `resource:update` required if the current user is the maintainer, `resource:update_any` otherwise.","operationId":"ResourceVersion-request_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionIn","description":"Meta-data for the resource version to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}":{"get":{"tags":["ResourceVersion"],"summary":"Get version of a resource","description":"Get a specific resource version for a specific resource.\n\nPermission `resource:read` required. If the status of the resource version is not `LATEST` or `SYNCHRONIZED` and\nthe current user is not the maintainer, then the permission `resource:read_any` is required.","operationId":"ResourceVersion-get_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/tree":{"get":{"tags":["ResourceVersion"],"summary":"Download folder structure of resource","description":"Get the folder structure of the resources. Only available if the resource was previously downloaded to the cluster.\n\nPermission `resource:read` required.","operationId":"ResourceVersion-resource_file_tree","security":[{"Session Token":[]}],"parameters":[{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"},{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FileTree"},"title":"Response Resourceversion-Resource File Tree"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_review":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version review","description":"Request the review of a resource version.\n\nPermission `resource:update` required.","operationId":"ResourceVersion-request_resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_sync":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version synchronization","description":"Request the synchronization of a resource version to the cluster.\n\nPermission `resource:request_sync` required.","operationId":"ResourceVersion-request_resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSynchronizationRequestIn","description":"Meta-data for the synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/review":{"put":{"tags":["ResourceVersion"],"summary":"Review resource version","description":"Review answer the resource version.\n\nPermission `resource:update_status` required.","operationId":"ResourceVersion-resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer for the resource version review"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/sync":{"put":{"tags":["ResourceVersion"],"summary":"Synchronize resource version with cluster","description":"Synchronize the resource version to the cluster.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer to the resource version synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/latest":{"put":{"tags":["ResourceVersion"],"summary":"Set resource version to latest","description":"Set the resource version as the latest version.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_latest","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/cluster":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version on cluster","description":"Delete the resource version on the cluster.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_cluster","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/s3":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version in S3","description":"Delete the resource version in the S3 bucket.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_s3","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news":{"post":{"tags":["News"],"summary":"Create news","description":"Create a news event.\n\nPermission `news:create` required.","operationId":"News-create_news","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsIn","description":"Meta-data for news event to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["News"],"summary":"List news","description":"List all news events with filters.\n\nThis endpoint enforces keyset pagination. To iterate over all news, follow the link provided in the `Link` header.\nA missing `Link` header indicates that you iterated over all news with the current filters.\n\nPermission `news:list` required.","operationId":"News-list_news","security":[{"Session Token":[]}],"parameters":[{"name":"created_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967296,"minimum":0},{"type":"null"}],"description":"Filter for news that are created after this UNIX timestamp","title":"Created After"},"description":"Filter for news that are created after this UNIX timestamp"},{"name":"creator_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for news created by a specific user","title":"Creator Id"},"description":"Filter for news created by a specific user"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NewsOut"},"title":"Response News-List News"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<https://dev.clowm.de/api/news?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news/latest":{"get":{"tags":["News"],"summary":"Get latest news","description":"List the current news events.\n\nPermission `news:list` required.","operationId":"News-list_latest_news","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NewsOut"},"type":"array","title":"Response News-List Latest News"}}}}},"security":[{"Session Token":[]}]}},"/ui/news/{nid}":{"get":{"tags":["News"],"summary":"Get a specific news","description":"Get a specified news event.\n\nPermission `news:read` required.","operationId":"News-get_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["News"],"summary":"Delete a specific news","description":"Delete a specified news event.\n\nPermission `news:delete` required.","operationId":"News-delete_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/public/workflows":{"get":{"tags":["Public"],"summary":"Get available workflows","description":"Public route to fetch all available workflows.","operationId":"Public-get_public_workflows","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PublicWorkflowOut"},"type":"array","title":"Response Public-Get Public Workflows"}}}}}}}},"components":{"schemas":{"AnonymizedWorkflowExecution":{"properties":{"workflow_execution_id":{"type":"string","title":"Workflow Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"pseudo_uid":{"type":"string","title":"Pseudo Uid","description":"Anonymized user ID of the user who ran the workflow execution","examples":["7ed4249857b656e96f456449796e461e6001d3fb2481a44701f70ca437bd53a2"]},"workflow_mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Mode Id","description":"ID of the workflow mode this workflow execution ran in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"workflow_version_id":{"type":"string","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"started_at":{"type":"string","format":"date","title":"Started At","description":"Day of the workflow execution","examples":["2023-01-01"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"developer_id":{"type":"string","title":"Developer Id","description":"ID of developer of the workflow","examples":["28c5353b8bb34984a8bd4169ba94c606"]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"End status of the workflow execution","examples":["SUCCESS"]}},"type":"object","required":["workflow_execution_id","pseudo_uid","workflow_version_id","started_at","workflow_id","developer_id","status"],"title":"AnonymizedWorkflowExecution"},"ApiTokenIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"}},"type":"object","required":["name","scopes"],"title":"ApiTokenIn"},"ApiTokenOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]}},"type":"object","required":["name","scopes","token_id","uid","created_at"],"title":"ApiTokenOut"},"ApiTokenPrivateOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]},"token":{"type":"string","title":"Token","description":"The actual token used for authentication","examples":["J21NRKUYgyVUgvJ3cIdllS-MMa9ny1UDKFF18aetDvo"]}},"type":"object","required":["name","scopes","token_id","uid","created_at","token"],"title":"ApiTokenPrivateOut"},"Body_Bucket-update_bucket_public_state":{"properties":{"public":{"type":"boolean","title":"Public","description":"New public state"}},"type":"object","required":["public"],"title":"Body_Bucket-update_bucket_public_state"},"Body_Workflow_Version-upload_workflow_version_icon":{"properties":{"icon":{"type":"string","format":"binary","title":"Icon","description":"Icon for the Workflow."}},"type":"object","required":["icon"],"title":"Body_Workflow Version-upload_workflow_version_icon"},"BucketIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]}},"type":"object","required":["name","description"],"title":"BucketIn","description":"Schema for creating a new bucket."},"BucketOut":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]},"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]},"owner_id":{"type":"string","title":"Owner Id","description":"UID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"public":{"type":"boolean","title":"Public","description":"Flag if the bucket is anonymously readable"}},"type":"object","required":["name","description","created_at","owner_id","public"],"title":"BucketOut","description":"Schema for answering a request with a bucket."},"BucketPermissionIn":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","format":"uuid","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionIn"},"BucketPermissionOut":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionOut","description":"Schema for the bucket permissions."},"BucketPermissionParameters":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"}},"type":"object","required":["scopes"],"title":"BucketPermissionParameters","description":"Schema for the parameters of a bucket permission."},"BucketSizeLimits":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]}},"type":"object","title":"BucketSizeLimits","description":"Schema to represent bucket limits."},"BucketType":{"type":"string","enum":["OWN","ALL","PERMISSION"],"title":"BucketType","description":"Enumeration for the type of buckets to fetch from the DB\n\nOWN: Only fetch buckets that the user owns\nPERMISSION: Only fetch foreign buckets that the user has access to\nALL: Fetch all buckets that the user has access to"},"DevWorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"mode":{"anyOf":[{"$ref":"#/components/schemas/WorkflowModeIn"},{"type":"null"}],"description":"Mode of the workflow with an alternative entrypoint"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow execution requires"}},"type":"object","required":["parameters","git_commit_hash","repository_url","nextflow_version"],"title":"DevWorkflowExecutionIn"},"DocumentationEnum":{"type":"string","enum":["usage.md","input.md","output.md","changelog.md","parameter_schema.json","clowm_info.json","CITATIONS.md"],"title":"DocumentationEnum"},"FileTree":{"properties":{"type":{"type":"string","enum":["file","directory","link"],"title":"Type"},"name":{"type":"string","title":"Name"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"},"contents":{"anyOf":[{"items":{"$ref":"#/components/schemas/FileTree"},"type":"array"},{"type":"null"}],"title":"Contents"},"size":{"type":"integer","title":"Size"}},"type":"object","required":["type","name","size"],"title":"FileTree"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IconUpdateOut":{"properties":{"icon_url":{"type":"string","minLength":1,"format":"uri","title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["icon_url"],"title":"IconUpdateOut"},"InstanceSpecificDefaultParameters":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"}]},"type":"object"},"NewsIn":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event","default":"system"}},"type":"object","required":["content","title"],"title":"NewsIn"},"NewsOut":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event"},"news_id":{"type":"string","title":"News Id","description":"ID of the news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"]},"creator_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Id","description":"ID of the creator","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]}},"type":"object","required":["content","title","category","news_id","created_at"],"title":"NewsOut"},"NextflowVersion":{"type":"string","enum":["22.10.0","22.10.1","22.10.2","22.10.3","22.10.4","22.10.5","22.10.6","22.10.7","22.10.8","23.04.0","23.04.1","23.04.2","23.04.3","23.04.4","23.04.5","23.10.0","23.10.1","23.10.2","23.10.3","23.10.4","24.04.1","24.04.2","24.04.3","24.04.4","24.10.0"],"title":"NextflowVersion"},"OIDCProvider":{"type":"string","enum":["lifescience-aai","nfdi-aai"],"title":"OIDCProvider"},"OwnershipTransferRequestIn":{"properties":{"new_owner_uid":{"type":"string","format":"uuid","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Comment","description":"An optional comment for the transfer request","examples":["This is an example comment"]}},"type":"object","required":["new_owner_uid"],"title":"OwnershipTransferRequestIn"},"OwnershipTransferRequestOut":{"properties":{"new_owner_uid":{"type":"string","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"type":"string","title":"Comment","description":"An optional comment for the transfer request","default":"","examples":["This is an example comment"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Time when the ownership transfer was requested as UNIX timestamp","examples":[1640991600]},"current_owner_uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Owner Uid","description":"The current uid of the current owner if he exists","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"target_id":{"type":"string","title":"Target Id","description":"Id of the target that gets its ownership transferred"},"target_name":{"type":"string","title":"Target Name","description":"Name of the target","examples":["example-bucket","Example Workflow","Example Resource"]},"target_description":{"type":"string","title":"Target Description","description":"Description of then target","examples":["Some long description of a target"]},"target_type":{"$ref":"#/components/schemas/OwnershipTypeEnum","description":"Target type of the ownership transfer","examples":["bucket"]}},"type":"object","required":["new_owner_uid","created_at","target_id","target_name","target_description","target_type"],"title":"OwnershipTransferRequestOut"},"OwnershipTypeEnum":{"type":"string","enum":["bucket","workflow","resource"],"title":"OwnershipTypeEnum"},"ParameterExtension-Input":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterExtension-Output":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterVisibility":{"type":"integer","enum":[10,20,30,40],"title":"ParameterVisibility"},"ParameterVisibilityMapping":{"additionalProperties":{"$ref":"#/components/schemas/ParameterVisibility"},"type":"object"},"PermissionStatus":{"type":"string","enum":["ACTIVE","INACTIVE"],"title":"PermissionStatus","description":"Status of a bucket permission. Can be either `ACTIVE` or `INACTIVE`. A permission can only get `INACTIVE` if the\npermission itself has a time limit and the current time is not in the timespan."},"PublicWorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"latest_git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Latest Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"latest_version_tag":{"type":"string","maxLength":10,"minLength":5,"title":"Latest Version Tag","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"developer":{"type":"string","title":"Developer","description":"Name of the developer","default":"","examples":["Bilbo Baggins"]},"latest_version_timestamp":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Latest Version Timestamp","description":"Timestamp when the last version was created as UNIX timestamp","examples":[1640991600]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the workflow icon","readOnly":true,"examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["name","short_description","repository_url","workflow_id","latest_git_commit_hash","latest_version_tag","latest_version_timestamp","icon_url"],"title":"PublicWorkflowOut"},"ResourceIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true}},"type":"object","required":["release","name","description","source"],"title":"ResourceIn"},"ResourceOut":{"properties":{"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"maintainer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Maintainer Id","description":"ID of the maintainer","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"versions":{"items":{"$ref":"#/components/schemas/ResourceVersionOut"},"type":"array","title":"Versions","description":"Versions of the resource"}},"type":"object","required":["name","description","source","resource_id","maintainer_id","versions"],"title":"ResourceOut"},"ResourceVersionIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]}},"type":"object","required":["release"],"title":"ResourceVersionIn"},"ResourceVersionOut":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"status":{"$ref":"#/components/schemas/ResourceVersionStatus","description":"Status of the resource version"},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1672527600]},"compressed_size":{"type":"integer","maximum":1.8446744073709552e+19,"minimum":0.0,"title":"Compressed Size","description":"Size of the compressed resource in bytes","examples":[42097156608]},"cluster_path":{"type":"string","title":"Cluster Path","description":"Path to the resource on the cluster if the resource is synchronized","readOnly":true,"examples":["/vol/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4","/vol/resources/CLDB-0e240ccd/latest"]},"s3_path":{"type":"string","title":"S3 Path","description":"Path to the resource in the S3 Bucket. Not publicly available.","readOnly":true,"examples":["s3://clowm-data/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4/resource.tar.gz"]}},"type":"object","required":["release","status","resource_version_id","resource_id","created_at","compressed_size","cluster_path","s3_path"],"title":"ResourceVersionOut"},"ResourceVersionStatus":{"type":"string","enum":["RESOURCE_REQUESTED","WAIT_FOR_REVIEW","DENIED","APPROVED","SYNC_REQUESTED","SYNCHRONIZING","SYNC_ERROR","SYNCHRONIZED","SETTING_LATEST","LATEST","CLUSTER_DELETING","CLUSTER_DELETE_ERROR","S3_DELETING","S3_DELETE_ERROR","S3_DELETED"],"title":"ResourceVersionStatus","description":"Enumeration for the possible status of a resource version."},"RoleEnum":{"type":"string","enum":["administrator","user","reviewer","developer","db_maintainer"],"title":"RoleEnum"},"S3Key":{"properties":{"uid":{"type":"string","title":"Uid","description":"UID of the user of that access key","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"access_key":{"type":"string","title":"Access Key","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"]},"secret_key":{"type":"string","title":"Secret Key","description":"Secret of the S3 access key","examples":["2F5uNTI1qvt4oAroXV0wWct8rWclL2QvFXKqSqjS"]}},"type":"object","required":["uid","access_key","secret_key"],"title":"S3Key","description":"Schema for a S3 key associated with a user."},"UserIn":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","examples":[["user"]]},"email":{"type":"string","format":"email","title":"Email","description":"Email of the user","examples":["user@example.org"]}},"type":"object","required":["display_name","email"],"title":"UserIn"},"UserOut":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["display_name","uid"],"title":"UserOut","description":"Schema for a user."},"UserOutExtended":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]},"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"lifescience_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lifescience Id","description":"Lifesicence AAI ID of the user","examples":["18b59678f16d2c59306c0aedb1dc7ddcfe162456"]},"nfdi_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nfdi Id","description":"NFDI AAI ID of the user","examples":["18b59678f16d2c59306c0aedb1dc7ddcfe162456"]},"invitation_token_created_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invitation Token Created At","description":"Timestamp when the invitation token was created as UNIX timestamp"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email","description":"Email of the user","examples":["user@example.org"]},"gravatar_url":{"type":"string","minLength":1,"format":"uri","title":"Gravatar Url","description":"URL to the gravatar avatar based on the users email","readOnly":true,"examples":["https://gravatar.com/avatar/87a8c45825eb709ee8e453d2c0f8154e1b9bf4b45bb9b81b7662177340aa9d38"]}},"type":"object","required":["roles","display_name","uid","gravatar_url"],"title":"UserOutExtended"},"UserRequestAnswer":{"properties":{"deny":{"type":"boolean","title":"Deny","description":"Flag to indicate if the request was denied.","default":false},"reason":{"anyOf":[{"type":"string","maxLength":512,"minLength":16},{"type":"null"}],"title":"Reason","description":"Reason why the request was denied or approved. Required if request is denied."}},"type":"object","title":"UserRequestAnswer"},"UserRoles":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]}},"type":"object","required":["roles"],"title":"UserRoles"},"UserSynchronizationRequestIn":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]}},"type":"object","required":["reason"],"title":"UserSynchronizationRequestIn"},"UserSynchronizationRequestOut":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"requester_id":{"type":"string","title":"Requester Id","description":"ID of the user that requested this resource synchronization","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["reason","resource_version_id","resource_id","requester_id"],"title":"UserSynchronizationRequestOut"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WorkflowCredentialsIn":{"properties":{"token":{"type":"string","maxLength":128,"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","required":["token"],"title":"WorkflowCredentialsIn"},"WorkflowCredentialsOut":{"properties":{"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","title":"WorkflowCredentialsOut"},"WorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["parameters","workflow_version_id"],"title":"WorkflowExecutionIn"},"WorkflowExecutionOut":{"properties":{"workflow_version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"execution_id":{"type":"string","title":"Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"executor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executor Id","description":"UID of user who started the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"start_time":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Start Time","description":"Start time of the workflow execution as UNIX timestamp","examples":[1640991600]},"end_time":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"End Time","description":"End time of the workflow execution as UNIX timestamp","examples":[1640991600]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"Status of the workflow execution","examples":["RUNNING"]},"workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Id","description":"Id of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"logs_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where logs and reports are saved.","examples":["s3://example-bucket/logs/run-591b6a6ea1f0420d8a20a7a60704f695"]},"provenance_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where provenance information is saved.","examples":["s3://example-bucket/provenance/run-591b6a6ea1f0420d8a20a7a60704f695"]},"debug_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where debug information from Nextflow is saved.","examples":["s3://example-bucket/debug/run-591b6a6ea1f0420d8a20a7a60704f695"]},"cpu_time":{"type":"string","format":"duration","title":"Cpu Time","description":"The consumed cpu time in ISO 8601 format","examples":["P4DT12H30M5S"]}},"type":"object","required":["execution_id","start_time","status","cpu_time"],"title":"WorkflowExecutionOut"},"WorkflowExecutionStatus":{"type":"string","enum":["PENDING","SCHEDULED","RUNNING","CANCELED","SUCCESS","ERROR"],"title":"WorkflowExecutionStatus","description":"Enumeration for the status on a workflow execution."},"WorkflowIn":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"initial_version":{"type":"string","maxLength":10,"minLength":5,"title":"Initial Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","maxItems":10,"title":"Modes","description":"List of modes with alternative entrypoint the new workflow has","default":[]},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["name","short_description","repository_url","git_commit_hash","initial_version","nextflow_version"],"title":"WorkflowIn"},"WorkflowModeIn":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]}},"type":"object","required":["schema_path","entrypoint","name"],"title":"WorkflowModeIn"},"WorkflowModeOut":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]},"mode_id":{"type":"string","title":"Mode Id","description":"ID of the workflow mode","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["schema_path","entrypoint","name","mode_id"],"title":"WorkflowModeOut"},"WorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"versions":{"items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"type":"array","title":"Versions","description":"Versions of the workflow"},"developer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Developer Id","description":"ID of developer of the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"private":{"type":"boolean","title":"Private","description":"Flag if the workflow is hosted in a private git repository","default":false}},"type":"object","required":["name","short_description","repository_url","workflow_id","versions"],"title":"WorkflowOut"},"WorkflowStatistic":{"properties":{"day":{"type":"string","format":"date","title":"Day","description":"Day of the datapoint","examples":["2023-01-01"]},"count":{"type":"integer","title":"Count","description":"Number of started workflows on that day","examples":[1]}},"type":"object","required":["day","count"],"title":"WorkflowStatistic"},"WorkflowUpdate":{"properties":{"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"append_modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","title":"Append Modes","description":"Add modes to the new workflow version"},"delete_modes":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Delete Modes","description":"Delete modes for the new workflow version.","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["version","git_commit_hash"],"title":"WorkflowUpdate"},"WorkflowVersionMetadataIn":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataIn"},"WorkflowVersionMetadataOut":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataOut"},"WorkflowVersionOut":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the corresponding workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1640991600]},"modes":{"items":{"type":"string"},"type":"array","title":"Modes","description":"Optional modes his workflow version has","default":[],"examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"parameter_extension":{"anyOf":[{"$ref":"#/components/schemas/ParameterExtension-Output"},{"type":"null"}],"description":"Parameter extension specific for this CloWM instance"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["status","workflow_id","version","workflow_version_id","created_at","nextflow_version"],"title":"WorkflowVersionOut"},"WorkflowVersionStatus":{"type":"string","enum":["CREATED","DENIED","PUBLISHED","DEPRECATED"],"title":"WorkflowVersionStatus","description":"Enumeration for the possible status of a workflow version."},"WorkflowVersionStatusSchema":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]}},"type":"object","required":["status"],"title":"WorkflowVersionStatusSchema"}},"securitySchemes":{"Session Token":{"type":"apiKey","description":"The JWT in this cookie is used by the website and should not be used when communicating directly with the API.","in":"cookie","name":"clowm-jwt"}}}} \ No newline at end of file +{"openapi":"3.1.0","info":{"title":"CloWM UI API","description":"This is the API for the CloWM UI. It is only for internal use and will change without prior notice.","version":"1.0"},"servers":[{"url":"/api"}],"paths":{"/auth/login/{provider}":{"get":{"tags":["Auth"],"summary":"Kickstart the login flow","description":"Redirect route to OIDC provider to kickstart the login process.","operationId":"Auth-kickstart_login","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider","description":"The OIDC provider to use for login"},"description":"The OIDC provider to use for login"},{"name":"invitation_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":43,"maxLength":43},{"type":"null"}],"description":"Unique token to validate an invitation","title":"Invitation Token"},"description":"Unique token to validate an invitation"},{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Will be appended to redirect response in the callback route as URL query parameter `next`","title":"Next"},"description":"Will be appended to redirect response in the callback route as URL query parameter `next`"}],"responses":{"302":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login/callback/{provider}":{"get":{"tags":["Auth"],"summary":"LifeScience Login Callback","description":"Callback for the login process with an OIDC Provider.\n\nVisit the route login route to start the login process.\n\nIf the user is already known to the system, then a JWT token will be created and sent via the 'set-cookie' header.\nThe key for this Cookie is 'bearer'.\n\nIf the user is new, he will be created him and then a JWT token is issued.\n\nThis JWT has to be sent to all authorized endpoints via the HTTPBearer scheme.","operationId":"Auth-login_callback","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider"}}],"responses":{"302":{"description":"Successful Response","headers":{"Set-Cookie":{"description":"JWT for accessing the API","schema":{"type":"string","example":"clowm-jwt=fake-jwt-cookie; Domain=localhost; Max-Age=691200; Path=/; SameSite=strict; Secure"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/account/connect/{provider}":{"get":{"tags":["Auth"],"summary":"Kickstart the account connection flow","description":"Redirect route to OIDC provider to connect the CloWM account with the AAI account.","operationId":"Auth-kickstart_account_connection","security":[{"Session Token":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider","description":"The OIDC provider to use for login"},"description":"The OIDC provider to use for login"}],"responses":{"302":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/account/callback/{provider}":{"get":{"tags":["Auth"],"summary":"LifeScience Login Callback","description":"Callback for the account connection process with an OIDC provider.","operationId":"Auth-account_connection_callback","security":[{"Session Token":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider"}}],"responses":{"302":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"get":{"tags":["Auth"],"summary":"Logout","description":"Logout the user from the system by deleting the bearer cookie.","operationId":"Auth-logout","responses":{"302":{"description":"Successful Response","headers":{"Set-Cookie":{"description":"JWT for accessing the API","schema":{"type":"string","example":"clowm-jwt=; Domain=localhost; Max-Age=0; Path=/; SameSite=strict; Secure"}}}}}}},"/ui/tokens":{"get":{"tags":["APIToken"],"summary":"List API token","description":"List meta information about all API token.\n\nPermissions `api_token:list_all` required. See parameter `uid` for exception.","operationId":"APIToken-list_token","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiTokenOut"},"title":"Response Apitoken-List Token"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["APIToken"],"summary":"Create new API token","description":"Create a new API token for the current user.\n\nPermission `api_token:create` required.","operationId":"APIToken-create_token","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenIn","description":"Meta-data for Api token to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenPrivateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/tokens/{tid}":{"get":{"tags":["APIToken"],"summary":"Get API token","description":"Get an API token by id.\n\nPermission `api_token:read` required if the current user is the owner of the API token,\notherwise `api_token:read_any` required.","operationId":"APIToken-get_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["APIToken"],"summary":"Delete API token","description":"Delete an API token by id.\n\nPermission `api_token:delete` required if the current user is the owner of the API token,\notherwise `api_token:delete_any` required.","operationId":"APIToken-delete_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users":{"post":{"tags":["User"],"summary":"Create User","description":"Create a new user in the system and notify him.\n\nPermission `user:create` required.","operationId":"User-create_user","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserIn","description":"Meta-data for user to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["User"],"summary":"List users and search by their name","description":"List all users in the system..\n\nPermission `user:list` required.","operationId":"User-list_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter users by a substring in their name.","examples":["Bilbo"],"title":"Name Substring"},"description":"Filter users by a substring in their name."},{"name":"filter_roles","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/RoleEnum"}},{"type":"null"}],"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression.","title":"Filter Roles"},"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOutExtended"},"title":"Response User-List Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/search":{"get":{"tags":["User"],"summary":"Search Users","description":"Search for users in the system by their name.\n\nPermission `user: search` required.","operationId":"User-search_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":30,"description":"Filter users by a substring in their name.","title":"Name Substring"},"description":"Filter users by a substring in their name."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOut"},"title":"Response User-Search Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/me":{"get":{"tags":["User"],"summary":"Get the logged in user","description":"Return the user associated with the used JWT.\n\nPermission `user:read` required.","operationId":"User-get_logged_in_user","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}}},"security":[{"Session Token":[]}]}},"/ui/users/{uid}":{"get":{"tags":["User"],"summary":"Get a user by its uid","description":"Return the user with the specific uid.\n\nPermission `user:read` required.","operationId":"User-get_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["User"],"summary":"Delete a user","description":"Delete a user and his S3 account.\n\nPermission `user:delete` required if the current user is the target user.","operationId":"User-delete_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/roles":{"put":{"tags":["User"],"summary":"Update user roles","description":"Update the roles of a user.\n\nPermission `user:update` required.","operationId":"User-update_roles","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRoles","description":"The new roles of the user"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/invitation":{"patch":{"tags":["User"],"summary":"Resend Invitation","description":"Resend the invitation link for an user that has an open invitation.\n\nPermission `user:create` required.","operationId":"User-resend_invitation","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys":{"get":{"tags":["S3Key"],"summary":"Get the S3 Access keys from a user","description":"Get all the S3 Access keys for a specific user.\n\nPermission `s3_key:list` required if the current user is the target, otherwise `s3_key:list_all` required.","operationId":"S3Key-get_user_keys","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/S3Key"},"title":"Response S3Key-Get User Keys"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["S3Key"],"summary":"Create a Access key for a user","description":"Create a S3 Access key for a specific user.\n\nPermission `s3_key:create` required if the current user is the target, otherwise `s3_key:create_any` required.","operationId":"S3Key-create_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys/{access_id}":{"get":{"tags":["S3Key"],"summary":"Get a specific S3 Access key from a user","description":"Get a specific S3 Access Key for a specific user.\n\nPermission `s3_key:read` required if the current user is the target, otherwise `s3_key:read_any` required.","operationId":"S3Key-get_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["S3Key"],"summary":"Delete a specific S3 Access key from a user","description":"Delete a specific S3 Access key for a specific user.\n\nPermission `s3_key:delete` required if the current user is the target, otherwise `s3_key:delete_any` required.","operationId":"S3Key-delete_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets":{"get":{"tags":["Bucket"],"summary":"List buckets","description":"List all the buckets in the system or of the desired user where the user has permissions for.\n\nPermission `bucket:list_all` required. See parameter `owner_id` for exception.","operationId":"Bucket-list_buckets","security":[{"Session Token":[]}],"parameters":[{"name":"owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Owner Id"},"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target."},{"name":"bucket_type","in":"query","required":false,"schema":{"$ref":"#/components/schemas/BucketType","description":"Type of the bucket to get. Ignored when `user` parameter not set","default":"ALL"},"description":"Type of the bucket to get. Ignored when `user` parameter not set"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketOut"},"title":"Response Bucket-List Buckets"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket for the current user","description":"Create a bucket for the current user.\n\nThe name of the bucket has some constraints.\nFor more information see the\n[Ceph documentation](https://docs.ceph.com/en/quincy/radosgw/s3/bucketops/#constraints)\n\nPermission `bucket:create` required.","operationId":"Bucket-create_bucket","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketIn","description":"Meta-data for bucket to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"List bucket OTRs","description":"Get the ownership transfer requests for buckets.\n\nPermission `bucket:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `bucket:list_all`","operationId":"Bucket-list_bucket_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Bucket-List Bucket Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}":{"get":{"tags":["Bucket"],"summary":"Get a bucket by its name","description":"Get a bucket by its name if the current user has READ permissions for the bucket.\n\nPermission `bucket:read` required if the current user is the owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket","description":"Delete a bucket by its name. Only the owner of the bucket can delete the bucket.\n\nPermission `bucket:delete` required if the current user is the owner of the bucket,\notherwise `bucket:delete_any` required.","operationId":"Bucket-delete_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"force_delete","in":"query","required":false,"schema":{"type":"boolean","description":"Delete even non-empty bucket","default":false,"title":"Force Delete"},"description":"Delete even non-empty bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"Get a bucket OTR","description":"Get a specific bucket ownership transfer request.\n\nPermission `bucket:read` required if the current user is the current or new owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket OTR","description":"Create a ownership transfer request for a specific bucket.\n\nPermission `bucket:update` required if the current user is the current owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-create_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the bucket OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Bucket"],"summary":"Accept a bucket OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `bucket:update` required if the current user is the new owner of the workflow,\notherwise `bucket:update_any` required.","operationId":"Bucket-accept_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket OTR","description":"Delete/Reject a bucket ownership transfer request.\n\nPermission `bucket:update` required if the current user is the current or new owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-delete_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/public":{"patch":{"tags":["Bucket"],"summary":"Update public status","description":"Update the buckets public state.\n\nPermission `bucket:update` required if the current user is the owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-update_bucket_public_state","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_Bucket-update_bucket_public_state"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/limits":{"patch":{"tags":["Bucket"],"summary":"Update bucket limits","description":"Update the buckets size limits.\n\nPermission `bucket:update_any` required.","operationId":"Bucket-update_bucket_limits","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketSizeLimits","description":"New size limits for bucket"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions.","description":"List all the bucket permissions in the system.\n\nPermission `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions","security":[{"Session Token":[]}],"parameters":[{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["BucketPermission"],"summary":"Create a permission.","description":"Create a permission for a bucket and user.\n\nPermission `bucket_permission:create` required.","operationId":"BucketPermission-create_permission","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionIn","description":"Permission to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a user.","description":"List all the bucket permissions for the given user.\n\nPermission `bucket_permission:list` required if current user is the target the bucket permission,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per User"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a bucket.","description":"List all the bucket permissions for the given bucket.\n\nPermission `bucket_permission:list` required if current user is owner of the bucket,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per Bucket"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get permission for bucket and user combination.","description":"Get the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:read` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:read_any` required.","operationId":"BucketPermission-get_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["BucketPermission"],"summary":"Update a bucket permission","description":"Update a permission for a bucket and user.\n\nPermission `bucket_permission:update` required.","operationId":"BucketPermission-update_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionParameters","description":"Permission to create"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["BucketPermission"],"summary":"Delete a bucket permission","description":"Delete the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:delete` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:delete_any` required.","operationId":"BucketPermission-delete_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows":{"post":{"tags":["Workflow"],"summary":"Create a new workflow","description":"Create a new workflow.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow-create_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowIn","description":"Meta-date for the workflow to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow"],"summary":"List workflows","description":"List all workflows.\n\nPermission `workflow:list` required.","operationId":"Workflow-list_workflows","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter workflows by a substring in their name.","examples":["blast"],"title":"Name Substring"},"description":"Filter workflows by a substring in their name."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`.","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`."},{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowOut"},"title":"Response Workflow-List Workflows"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"List workflow OTRs","description":"Get the ownership transfer requests for workflows.\n\nPermission `workflow:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `workflow:list_all`","operationId":"Workflow-list_workflow_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Workflow-List Workflow Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/developer_statistics":{"get":{"tags":["Workflow"],"summary":"Get anonymized workflow execution","description":"Get the workflow executions with meta information and anonymized user IDs.\n\nPermission `workflow:read` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:read_any`.","operationId":"Workflow-get_developer_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter by the developer of the workflows","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter by the developer of the workflows"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"description":"Filter by workflow IDs","title":"Workflow Id"},"description":"Filter by workflow IDs"},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions after this date","title":"Start"},"description":"Filter by workflow executions after this date"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions before this date","title":"End"},"description":"Filter by workflow executions before this date"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnonymizedWorkflowExecution"},"title":"Response Workflow-Get Developer Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}":{"get":{"tags":["Workflow"],"summary":"Get a workflow","description":"Get a specific workflow.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow","description":"Delete a workflow.\n\nPermission `workflow:delete` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:delete_any`.","operationId":"Workflow-delete_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"Get a workflow OTR","description":"Get a specific workflow ownership transfer request.\n\nPermission `workflow:read` required if current user is the current or new owner of the workflow,\notherwise `workflow:read_any` required.","operationId":"Workflow-get_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Workflow"],"summary":"Create a workflow OTR","description":"Create a ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the current owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-create_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for workflow OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Workflow"],"summary":"Accept a workflow OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-accept_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow OTR","description":"Delete/Reject a workflow ownership transfer request.\n\nPermission `workflow:update` required if current user is the current or new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-delete_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/statistics":{"get":{"tags":["Workflow"],"summary":"Get statistics for a workflow","description":"Get the number of started workflow per day.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowStatistic"},"title":"Response Workflow-Get Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/update":{"post":{"tags":["Workflow"],"summary":"Update a workflow","description":"Create a new workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow-update_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdate","description":"Meta-data for the workflow version to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions":{"get":{"tags":["Workflow Version"],"summary":"Get all versions of a workflow","description":"List all versions of a Workflow.\n\nPermission `workflow:list` required.","operationId":"Workflow Version-list_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"title":"Response Workflow Version-List Workflow Version"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}":{"get":{"tags":["Workflow Version"],"summary":"Get a workflow version","description":"Get a specific version of a workflow.\n\nPermission `workflow:read` required if the version is public or you are the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit `git_commit_hash` of specific version or `latest`.","examples":["latest","ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit `git_commit_hash` of specific version or `latest`."},{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/status":{"patch":{"tags":["Workflow Version"],"summary":"Update status of workflow version","description":"Update the status of a workflow version.\n\nPermission `workflow:update_status`","operationId":"Workflow Version-update_workflow_version_status","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionStatusSchema","description":"New Status of the workflow version"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/metadata":{"get":{"tags":["Workflow Version"],"summary":"Get metadata of workflow version","description":"Get the metadata of a workflow version.\n\nPermission `workflow:read` required if the current user is the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Version"],"summary":"Update metadata of workflow version","description":"Update the metadata of a workflow version.\n\nPermission `workflow:update` required if the current user is the developer of the workflow,\notherwise `workflow:update_any`","operationId":"Workflow Version-update_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/deprecate":{"patch":{"tags":["Workflow Version"],"summary":"Deprecate a workflow version","description":"Deprecate a workflow version.\n\nPermission `workflow:update` required if you are the developer of the workflow,\notherwise `workflow:update_status`","operationId":"Workflow Version-deprecate_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/parameter-extension":{"patch":{"tags":["Workflow Version"],"summary":"Update parameter extension of workflow version","description":"Update the parameter extension of a workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-update_workflow_version_parameter_extension","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParameterExtension-Input","description":"Parameter extension specific for this CloWM instance"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/documentation":{"get":{"tags":["Workflow Version"],"summary":"Fetch documentation for a workflow version","description":"Get the documentation for a specific workflow version.\nStreams the response directly from the right git repository.\n\nPermission `workflow:read` required.","operationId":"Workflow Version-download_workflow_documentation","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."},{"name":"document","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DocumentationEnum","description":"Specify which type of documentation the client wants to fetch","default":"usage.md"},"description":"Specify which type of documentation the client wants to fetch"},{"name":"mode_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Workflow Mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"Workflow Mode"}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/icon":{"post":{"tags":["Workflow Version"],"summary":"Upload icon for workflow version","description":"Upload an icon for the workflow version and returns the new icon URL.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-upload_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_Workflow_Version-upload_workflow_version_icon"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IconUpdateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Version"],"summary":"Delete icon of workflow version","description":"Delete the icon of the workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-delete_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions":{"post":{"tags":["Workflow Execution"],"summary":"Start a new workflow execution","description":"Start a new workflow execution. Workflow versions wit status `DEPRECATED` or `DENIED` can't be started.\n\nPermission `workflow_execution:create` required if workflow versions status is `PUBLISHED`,\notherwise `workflow_execution:create_any` required.","operationId":"Workflow Execution-start_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow Execution"],"summary":"List all workflow executions","description":"Get all workflow executions.\n\nThis endpoint enforces keyset pagination. To iterate over all workflow executions, follow the link provided in the\n`Link` header.\nA missing `Link` header indicates that you iterated over all workflow executions with the current filters.\n\nPermission `workflow_execution:list` required, if `executor_id` is the same as the current user,\notherwise `workflow_execution:list_all` required.","operationId":"Workflow Execution-list_workflow_executions","security":[{"Session Token":[]}],"parameters":[{"name":"executor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Executor Id"},"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required."},{"name":"execution_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionStatus"}},{"type":"null"}],"description":"Filter for status of workflow execution","title":"Execution Status"},"description":"Filter for status of workflow execution"},{"name":"workflow_version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":40,"maxLength":40,"pattern":"^[0-9a-f]+$"},{"type":"null"}],"description":"Filter for workflow version","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Workflow Version Id"},"description":"Filter for workflow version"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Workflow Id"},"description":"Filter for workflow"},{"name":"start_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started after this UNIX timestamp","examples":[1640991600],"title":"Start After"},"description":"Filter for workflow executions that started after this UNIX timestamp"},{"name":"start_before","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started before this UNIX timestamp","examples":[1640991600],"title":"Start Before"},"description":"Filter for workflow executions that started before this UNIX timestamp"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionOut"},"title":"Response Workflow Execution-List Workflow Executions"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<https://dev.clowm.de/api/workflow_executions?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/arbitrary":{"post":{"tags":["Workflow Execution"],"summary":"Start a workflow execution with arbitrary git repository","description":"Start a new workflow execution from an arbitrary git repository.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow Execution-start_arbitrary_workflow","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevWorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Session Token":[]}]}},"/ui/workflow_executions/{eid}":{"get":{"tags":["Workflow Execution"],"summary":"Get a workflow execution","description":"Get a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Execution"],"summary":"Delete a workflow execution","description":"Delete a specific workflow execution.\n\nPermission `workflow_execution:delete` required if the current user started the workflow execution,\notherwise `workflow_execution:delete_any` required.","operationId":"Workflow Execution-delete_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/params":{"get":{"tags":["Workflow Execution"],"summary":"Get the parameters of a workflow execution","description":"Get the parameters of a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution_params","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Workflow Execution-Get Workflow Execution Params"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/cancel":{"post":{"tags":["Workflow Execution"],"summary":"Cancel a workflow execution","description":"Cancel a running workflow execution.\n\nPermission `workflow_execution:cancel` required if the current user started the workflow execution,\notherwise `workflow_execution:cancel_any` required.","operationId":"Workflow Execution-cancel_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/credentials":{"get":{"tags":["Workflow Credentials"],"summary":"Get the credentials of a workflow","description":"Get the credentials for the repository of a workflow. Only the developer of a workflow can do this.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-get_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Credentials"],"summary":"Update the credentials of a workflow","description":"Update the credentials for the repository of a workflow.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-update_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsIn","description":"Updated credentials for the workflow git repository"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Credentials"],"summary":"Delete the credentials of a workflow","description":"Delete the credentials for the repository of a workflow.\n\nPermission `workflow:delete` required if the developer of the workflow is the same as the current user,\nother `workflow:delete_any`.","operationId":"Workflow Credentials-delete_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_modes/{mode_id}":{"get":{"tags":["Workflow Mode"],"summary":"Get workflow mode","description":"Get a workflow mode.\n\nPermission `workflow:read` required","operationId":"Workflow Mode-get_workflow_mode","security":[{"Session Token":[]}],"parameters":[{"name":"mode_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"ID of a workflow mode"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowModeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources":{"post":{"tags":["Resource"],"summary":"Request a new resource","description":"Request a new resources.\n\nPermission `resource:create` required.","operationId":"Resource-create_resource","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceIn","description":"Meta-data for the resource to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Resource"],"summary":"List resources","description":"List all resources.\n\nPermission `resource:list` required.","operationId":"Resource-list_resources","security":[{"Session Token":[]}],"parameters":[{"name":"maintainer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Maintainer Id"},"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required."},{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"description":"Filter resources by a substring in their name.","examples":["gtdb"],"title":"Name Substring"},"description":"Filter resources by a substring in their name."},{"name":"public","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter resources to by the public flag","title":"Public"},"description":"Filter resources to by the public flag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceOut"},"title":"Response Resource-List Resources"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/sync_requests":{"get":{"tags":["Resource"],"summary":"List resource sync requests","description":"List all resource sync requests.\n\nPermission `resource:update_any` required.","operationId":"Resource-list_sync_requests","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UserSynchronizationRequestOut"},"type":"array","title":"Response Resource-List Sync Requests"}}}}},"security":[{"Session Token":[]}]}},"/ui/resources/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"List resource OTRs","description":"Get the ownership transfer requests for resources.\n\nPermission `resource:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `resource:list_all`","operationId":"Resource-list_resource_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Resource-List Resource Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}":{"get":{"tags":["Resource"],"summary":"Get a resource","description":"Get a specific resource.\n\nPermission `resource:read` required.","operationId":"Resource-get_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource","description":"Delete a resources.\n\nPermission `resource:delete` required.","operationId":"Resource-delete_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"Get a resource OTR","description":"Get a specific resource ownership transfer request.\n\nPermission `resource:read` required if the current user is the current or new owner of the resource,\notherwise `resource:read_any` required.","operationId":"Resource-get_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Resource"],"summary":"Create a resource OTR","description":"Create a ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the current owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-create_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the resource OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Resource"],"summary":"Accept a resource OTR","description":"Accept an ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-accept_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource OTR","description":"Delete/Reject a resource ownership transfer request.\n\nPermission `resource:update` required if the current user is the current or new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-delete_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions":{"get":{"tags":["ResourceVersion"],"summary":"List versions of a resource","description":"List all the resource version for a specific resource.\n\nPermission 'resource:read' required.","operationId":"ResourceVersion-list_resource_versions","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionOut"},"title":"Response Resourceversion-List Resource Versions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["ResourceVersion"],"summary":"Request new version of a resource","description":"Request a new resource version.\n\nPermission `resource:update` required if the current user is the maintainer, `resource:update_any` otherwise.","operationId":"ResourceVersion-request_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionIn","description":"Meta-data for the resource version to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}":{"get":{"tags":["ResourceVersion"],"summary":"Get version of a resource","description":"Get a specific resource version for a specific resource.\n\nPermission `resource:read` required. If the status of the resource version is not `LATEST` or `SYNCHRONIZED` and\nthe current user is not the maintainer, then the permission `resource:read_any` is required.","operationId":"ResourceVersion-get_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/tree":{"get":{"tags":["ResourceVersion"],"summary":"Download folder structure of resource","description":"Get the folder structure of the resources. Only available if the resource was previously downloaded to the cluster.\n\nPermission `resource:read` required.","operationId":"ResourceVersion-resource_file_tree","security":[{"Session Token":[]}],"parameters":[{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"},{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FileTree"},"title":"Response Resourceversion-Resource File Tree"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_review":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version review","description":"Request the review of a resource version.\n\nPermission `resource:update` required.","operationId":"ResourceVersion-request_resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_sync":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version synchronization","description":"Request the synchronization of a resource version to the cluster.\n\nPermission `resource:request_sync` required.","operationId":"ResourceVersion-request_resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSynchronizationRequestIn","description":"Meta-data for the synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/review":{"put":{"tags":["ResourceVersion"],"summary":"Review resource version","description":"Review answer the resource version.\n\nPermission `resource:update_status` required.","operationId":"ResourceVersion-resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer for the resource version review"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/sync":{"put":{"tags":["ResourceVersion"],"summary":"Synchronize resource version with cluster","description":"Synchronize the resource version to the cluster.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer to the resource version synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/latest":{"put":{"tags":["ResourceVersion"],"summary":"Set resource version to latest","description":"Set the resource version as the latest version.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_latest","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/cluster":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version on cluster","description":"Delete the resource version on the cluster.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_cluster","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/s3":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version in S3","description":"Delete the resource version in the S3 bucket.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_s3","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news":{"post":{"tags":["News"],"summary":"Create news","description":"Create a news event.\n\nPermission `news:create` required.","operationId":"News-create_news","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsIn","description":"Meta-data for news event to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["News"],"summary":"List news","description":"List all news events with filters.\n\nThis endpoint enforces keyset pagination. To iterate over all news, follow the link provided in the `Link` header.\nA missing `Link` header indicates that you iterated over all news with the current filters.\n\nPermission `news:list` required.","operationId":"News-list_news","security":[{"Session Token":[]}],"parameters":[{"name":"created_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967296,"minimum":0},{"type":"null"}],"description":"Filter for news that are created after this UNIX timestamp","title":"Created After"},"description":"Filter for news that are created after this UNIX timestamp"},{"name":"creator_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for news created by a specific user","title":"Creator Id"},"description":"Filter for news created by a specific user"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NewsOut"},"title":"Response News-List News"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<https://dev.clowm.de/api/news?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news/latest":{"get":{"tags":["News"],"summary":"Get latest news","description":"List the current news events.\n\nPermission `news:list` required.","operationId":"News-list_latest_news","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NewsOut"},"type":"array","title":"Response News-List Latest News"}}}}},"security":[{"Session Token":[]}]}},"/ui/news/{nid}":{"get":{"tags":["News"],"summary":"Get a specific news","description":"Get a specified news event.\n\nPermission `news:read` required.","operationId":"News-get_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["News"],"summary":"Delete a specific news","description":"Delete a specified news event.\n\nPermission `news:delete` required.","operationId":"News-delete_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/public/workflows":{"get":{"tags":["Public"],"summary":"Get available workflows","description":"Public route to fetch all available workflows.","operationId":"Public-get_public_workflows","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PublicWorkflowOut"},"type":"array","title":"Response Public-Get Public Workflows"}}}}}}}},"components":{"schemas":{"AnonymizedWorkflowExecution":{"properties":{"workflow_execution_id":{"type":"string","title":"Workflow Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"pseudo_uid":{"type":"string","title":"Pseudo Uid","description":"Anonymized user ID of the user who ran the workflow execution","examples":["7ed4249857b656e96f456449796e461e6001d3fb2481a44701f70ca437bd53a2"]},"workflow_mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Mode Id","description":"ID of the workflow mode this workflow execution ran in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"workflow_version_id":{"type":"string","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"started_at":{"type":"string","format":"date","title":"Started At","description":"Day of the workflow execution","examples":["2023-01-01"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"developer_id":{"type":"string","title":"Developer Id","description":"ID of developer of the workflow","examples":["28c5353b8bb34984a8bd4169ba94c606"]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"End status of the workflow execution","examples":["SUCCESS"]}},"type":"object","required":["workflow_execution_id","pseudo_uid","workflow_version_id","started_at","workflow_id","developer_id","status"],"title":"AnonymizedWorkflowExecution"},"ApiTokenIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"}},"type":"object","required":["name","scopes"],"title":"ApiTokenIn"},"ApiTokenOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]}},"type":"object","required":["name","scopes","token_id","uid","created_at"],"title":"ApiTokenOut"},"ApiTokenPrivateOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]},"token":{"type":"string","title":"Token","description":"The actual token used for authentication","examples":["J21NRKUYgyVUgvJ3cIdllS-MMa9ny1UDKFF18aetDvo"]}},"type":"object","required":["name","scopes","token_id","uid","created_at","token"],"title":"ApiTokenPrivateOut"},"Body_Bucket-update_bucket_public_state":{"properties":{"public":{"type":"boolean","title":"Public","description":"New public state"}},"type":"object","required":["public"],"title":"Body_Bucket-update_bucket_public_state"},"Body_Workflow_Version-upload_workflow_version_icon":{"properties":{"icon":{"type":"string","format":"binary","title":"Icon","description":"Icon for the Workflow."}},"type":"object","required":["icon"],"title":"Body_Workflow Version-upload_workflow_version_icon"},"BucketIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]}},"type":"object","required":["name","description"],"title":"BucketIn","description":"Schema for creating a new bucket."},"BucketOut":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]},"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]},"owner_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Id","description":"UID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"public":{"type":"boolean","title":"Public","description":"Flag if the bucket is anonymously readable"}},"type":"object","required":["name","description","created_at","owner_id","public"],"title":"BucketOut","description":"Schema for answering a request with a bucket."},"BucketPermissionIn":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","format":"uuid","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionIn"},"BucketPermissionOut":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionOut","description":"Schema for the bucket permissions."},"BucketPermissionParameters":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"}},"type":"object","required":["scopes"],"title":"BucketPermissionParameters","description":"Schema for the parameters of a bucket permission."},"BucketSizeLimits":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]}},"type":"object","title":"BucketSizeLimits","description":"Schema to represent bucket limits."},"BucketType":{"type":"string","enum":["OWN","ALL","PERMISSION"],"title":"BucketType","description":"Enumeration for the type of buckets to fetch from the DB\n\nOWN: Only fetch buckets that the user owns\nPERMISSION: Only fetch foreign buckets that the user has access to\nALL: Fetch all buckets that the user has access to"},"DevWorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"mode":{"anyOf":[{"$ref":"#/components/schemas/WorkflowModeIn"},{"type":"null"}],"description":"Mode of the workflow with an alternative entrypoint"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow execution requires"}},"type":"object","required":["parameters","git_commit_hash","repository_url","nextflow_version"],"title":"DevWorkflowExecutionIn"},"DocumentationEnum":{"type":"string","enum":["usage.md","input.md","output.md","changelog.md","parameter_schema.json","clowm_info.json","CITATIONS.md"],"title":"DocumentationEnum"},"FileTree":{"properties":{"type":{"type":"string","enum":["file","directory","link"],"title":"Type"},"name":{"type":"string","title":"Name"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"},"contents":{"anyOf":[{"items":{"$ref":"#/components/schemas/FileTree"},"type":"array"},{"type":"null"}],"title":"Contents"},"size":{"type":"integer","title":"Size"}},"type":"object","required":["type","name","size"],"title":"FileTree"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IconUpdateOut":{"properties":{"icon_url":{"type":"string","minLength":1,"format":"uri","title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["icon_url"],"title":"IconUpdateOut"},"InstanceSpecificDefaultParameters":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"}]},"type":"object"},"NewsIn":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event","default":"system"}},"type":"object","required":["content","title"],"title":"NewsIn"},"NewsOut":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event"},"news_id":{"type":"string","title":"News Id","description":"ID of the news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"]},"creator_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Id","description":"ID of the creator","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]}},"type":"object","required":["content","title","category","news_id","created_at"],"title":"NewsOut"},"NextflowVersion":{"type":"string","enum":["22.10.0","22.10.1","22.10.2","22.10.3","22.10.4","22.10.5","22.10.6","22.10.7","22.10.8","23.04.0","23.04.1","23.04.2","23.04.3","23.04.4","23.04.5","23.10.0","23.10.1","23.10.2","23.10.3","23.10.4","24.04.1","24.04.2","24.04.3","24.04.4","24.10.0"],"title":"NextflowVersion"},"OIDCProvider":{"type":"string","enum":["lifescience-aai","nfdi-aai"],"title":"OIDCProvider"},"OwnershipTransferRequestIn":{"properties":{"new_owner_uid":{"type":"string","format":"uuid","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Comment","description":"An optional comment for the transfer request","examples":["This is an example comment"]}},"type":"object","required":["new_owner_uid"],"title":"OwnershipTransferRequestIn"},"OwnershipTransferRequestOut":{"properties":{"new_owner_uid":{"type":"string","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"type":"string","title":"Comment","description":"An optional comment for the transfer request","default":"","examples":["This is an example comment"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Time when the ownership transfer was requested as UNIX timestamp","examples":[1640991600]},"current_owner_uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Owner Uid","description":"The current uid of the current owner if he exists","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"target_id":{"type":"string","title":"Target Id","description":"Id of the target that gets its ownership transferred"},"target_name":{"type":"string","title":"Target Name","description":"Name of the target","examples":["example-bucket","Example Workflow","Example Resource"]},"target_description":{"type":"string","title":"Target Description","description":"Description of then target","examples":["Some long description of a target"]},"target_type":{"$ref":"#/components/schemas/OwnershipTypeEnum","description":"Target type of the ownership transfer","examples":["bucket"]}},"type":"object","required":["new_owner_uid","created_at","target_id","target_name","target_description","target_type"],"title":"OwnershipTransferRequestOut"},"OwnershipTypeEnum":{"type":"string","enum":["bucket","workflow","resource"],"title":"OwnershipTypeEnum"},"ParameterExtension-Input":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterExtension-Output":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterVisibility":{"type":"integer","enum":[10,20,30,40],"title":"ParameterVisibility"},"ParameterVisibilityMapping":{"additionalProperties":{"$ref":"#/components/schemas/ParameterVisibility"},"type":"object"},"PermissionStatus":{"type":"string","enum":["ACTIVE","INACTIVE"],"title":"PermissionStatus","description":"Status of a bucket permission. Can be either `ACTIVE` or `INACTIVE`. A permission can only get `INACTIVE` if the\npermission itself has a time limit and the current time is not in the timespan."},"PublicWorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"latest_git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Latest Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"latest_version_tag":{"type":"string","maxLength":10,"minLength":5,"title":"Latest Version Tag","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"developer":{"type":"string","title":"Developer","description":"Name of the developer","default":"","examples":["Bilbo Baggins"]},"latest_version_timestamp":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Latest Version Timestamp","description":"Timestamp when the last version was created as UNIX timestamp","examples":[1640991600]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the workflow icon","readOnly":true,"examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["name","short_description","repository_url","workflow_id","latest_git_commit_hash","latest_version_tag","latest_version_timestamp","icon_url"],"title":"PublicWorkflowOut"},"ResourceIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true}},"type":"object","required":["release","name","description","source"],"title":"ResourceIn"},"ResourceOut":{"properties":{"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"maintainer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Maintainer Id","description":"ID of the maintainer","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"versions":{"items":{"$ref":"#/components/schemas/ResourceVersionOut"},"type":"array","title":"Versions","description":"Versions of the resource"}},"type":"object","required":["name","description","source","resource_id","maintainer_id","versions"],"title":"ResourceOut"},"ResourceVersionIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]}},"type":"object","required":["release"],"title":"ResourceVersionIn"},"ResourceVersionOut":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"status":{"$ref":"#/components/schemas/ResourceVersionStatus","description":"Status of the resource version"},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1672527600]},"compressed_size":{"type":"integer","maximum":1.8446744073709552e+19,"minimum":0.0,"title":"Compressed Size","description":"Size of the compressed resource in bytes","examples":[42097156608]},"cluster_path":{"type":"string","title":"Cluster Path","description":"Path to the resource on the cluster if the resource is synchronized","readOnly":true,"examples":["/vol/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4","/vol/resources/CLDB-0e240ccd/latest"]},"s3_path":{"type":"string","title":"S3 Path","description":"Path to the resource in the S3 Bucket. Not publicly available.","readOnly":true,"examples":["s3://clowm-data/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4/resource.tar.gz"]}},"type":"object","required":["release","status","resource_version_id","resource_id","created_at","compressed_size","cluster_path","s3_path"],"title":"ResourceVersionOut"},"ResourceVersionStatus":{"type":"string","enum":["RESOURCE_REQUESTED","WAIT_FOR_REVIEW","DENIED","APPROVED","SYNC_REQUESTED","SYNCHRONIZING","SYNC_ERROR","SYNCHRONIZED","SETTING_LATEST","LATEST","CLUSTER_DELETING","CLUSTER_DELETE_ERROR","S3_DELETING","S3_DELETE_ERROR","S3_DELETED"],"title":"ResourceVersionStatus","description":"Enumeration for the possible status of a resource version."},"RoleEnum":{"type":"string","enum":["administrator","user","reviewer","developer","db_maintainer"],"title":"RoleEnum"},"S3Key":{"properties":{"uid":{"type":"string","title":"Uid","description":"UID of the user of that access key","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"access_key":{"type":"string","title":"Access Key","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"]},"secret_key":{"type":"string","title":"Secret Key","description":"Secret of the S3 access key","examples":["2F5uNTI1qvt4oAroXV0wWct8rWclL2QvFXKqSqjS"]}},"type":"object","required":["uid","access_key","secret_key"],"title":"S3Key","description":"Schema for a S3 key associated with a user."},"UserIn":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","examples":[["user"]]},"email":{"type":"string","format":"email","title":"Email","description":"Email of the user","examples":["user@example.org"]}},"type":"object","required":["display_name","email"],"title":"UserIn"},"UserOut":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["display_name","uid"],"title":"UserOut","description":"Schema for a user."},"UserOutExtended":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]},"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"lifescience_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lifescience Id","description":"Lifesicence AAI ID of the user","examples":["18b59678f16d2c59306c0aedb1dc7ddcfe162456"]},"nfdi_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nfdi Id","description":"NFDI AAI ID of the user","examples":["18b59678f16d2c59306c0aedb1dc7ddcfe162456"]},"invitation_token_created_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invitation Token Created At","description":"Timestamp when the invitation token was created as UNIX timestamp"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email","description":"Email of the user","examples":["user@example.org"]},"gravatar_url":{"type":"string","minLength":1,"format":"uri","title":"Gravatar Url","description":"URL to the gravatar avatar based on the users email","readOnly":true,"examples":["https://gravatar.com/avatar/87a8c45825eb709ee8e453d2c0f8154e1b9bf4b45bb9b81b7662177340aa9d38"]}},"type":"object","required":["roles","display_name","uid","gravatar_url"],"title":"UserOutExtended"},"UserRequestAnswer":{"properties":{"deny":{"type":"boolean","title":"Deny","description":"Flag to indicate if the request was denied.","default":false},"reason":{"anyOf":[{"type":"string","maxLength":512,"minLength":16},{"type":"null"}],"title":"Reason","description":"Reason why the request was denied or approved. Required if request is denied."}},"type":"object","title":"UserRequestAnswer"},"UserRoles":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]}},"type":"object","required":["roles"],"title":"UserRoles"},"UserSynchronizationRequestIn":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]}},"type":"object","required":["reason"],"title":"UserSynchronizationRequestIn"},"UserSynchronizationRequestOut":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"requester_id":{"type":"string","title":"Requester Id","description":"ID of the user that requested this resource synchronization","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["reason","resource_version_id","resource_id","requester_id"],"title":"UserSynchronizationRequestOut"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WorkflowCredentialsIn":{"properties":{"token":{"type":"string","maxLength":128,"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","required":["token"],"title":"WorkflowCredentialsIn"},"WorkflowCredentialsOut":{"properties":{"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","title":"WorkflowCredentialsOut"},"WorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["parameters","workflow_version_id"],"title":"WorkflowExecutionIn"},"WorkflowExecutionOut":{"properties":{"workflow_version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"execution_id":{"type":"string","title":"Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"executor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executor Id","description":"UID of user who started the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"start_time":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Start Time","description":"Start time of the workflow execution as UNIX timestamp","examples":[1640991600]},"end_time":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"End Time","description":"End time of the workflow execution as UNIX timestamp","examples":[1640991600]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"Status of the workflow execution","examples":["RUNNING"]},"workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Id","description":"Id of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"logs_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where logs and reports are saved.","examples":["s3://example-bucket/logs/run-591b6a6ea1f0420d8a20a7a60704f695"]},"provenance_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where provenance information is saved.","examples":["s3://example-bucket/provenance/run-591b6a6ea1f0420d8a20a7a60704f695"]},"debug_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where debug information from Nextflow is saved.","examples":["s3://example-bucket/debug/run-591b6a6ea1f0420d8a20a7a60704f695"]},"cpu_time":{"type":"string","format":"duration","title":"Cpu Time","description":"The consumed cpu time in ISO 8601 format","examples":["P4DT12H30M5S"]}},"type":"object","required":["execution_id","start_time","status","cpu_time"],"title":"WorkflowExecutionOut"},"WorkflowExecutionStatus":{"type":"string","enum":["PENDING","SCHEDULED","RUNNING","CANCELED","SUCCESS","ERROR"],"title":"WorkflowExecutionStatus","description":"Enumeration for the status on a workflow execution."},"WorkflowIn":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"initial_version":{"type":"string","maxLength":10,"minLength":5,"title":"Initial Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","maxItems":10,"title":"Modes","description":"List of modes with alternative entrypoint the new workflow has","default":[]},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["name","short_description","repository_url","git_commit_hash","initial_version","nextflow_version"],"title":"WorkflowIn"},"WorkflowModeIn":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]}},"type":"object","required":["schema_path","entrypoint","name"],"title":"WorkflowModeIn"},"WorkflowModeOut":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]},"mode_id":{"type":"string","title":"Mode Id","description":"ID of the workflow mode","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["schema_path","entrypoint","name","mode_id"],"title":"WorkflowModeOut"},"WorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"versions":{"items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"type":"array","title":"Versions","description":"Versions of the workflow"},"developer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Developer Id","description":"ID of developer of the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"private":{"type":"boolean","title":"Private","description":"Flag if the workflow is hosted in a private git repository","default":false}},"type":"object","required":["name","short_description","repository_url","workflow_id","versions"],"title":"WorkflowOut"},"WorkflowStatistic":{"properties":{"day":{"type":"string","format":"date","title":"Day","description":"Day of the datapoint","examples":["2023-01-01"]},"count":{"type":"integer","title":"Count","description":"Number of started workflows on that day","examples":[1]}},"type":"object","required":["day","count"],"title":"WorkflowStatistic"},"WorkflowUpdate":{"properties":{"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"append_modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","title":"Append Modes","description":"Add modes to the new workflow version"},"delete_modes":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Delete Modes","description":"Delete modes for the new workflow version.","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["version","git_commit_hash"],"title":"WorkflowUpdate"},"WorkflowVersionMetadataIn":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataIn"},"WorkflowVersionMetadataOut":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataOut"},"WorkflowVersionOut":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the corresponding workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1640991600]},"modes":{"items":{"type":"string"},"type":"array","title":"Modes","description":"Optional modes his workflow version has","default":[],"examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"parameter_extension":{"anyOf":[{"$ref":"#/components/schemas/ParameterExtension-Output"},{"type":"null"}],"description":"Parameter extension specific for this CloWM instance"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["status","workflow_id","version","workflow_version_id","created_at","nextflow_version"],"title":"WorkflowVersionOut"},"WorkflowVersionStatus":{"type":"string","enum":["CREATED","DENIED","PUBLISHED","DEPRECATED"],"title":"WorkflowVersionStatus","description":"Enumeration for the possible status of a workflow version."},"WorkflowVersionStatusSchema":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]}},"type":"object","required":["status"],"title":"WorkflowVersionStatusSchema"}},"securitySchemes":{"Session Token":{"type":"apiKey","description":"The JWT in this cookie is used by the website and should not be used when communicating directly with the API.","in":"cookie","name":"clowm-jwt"}}}} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ea13ca0..3533530 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@aws-sdk/lib-storage": "<3.729.0", "@aws-sdk/s3-request-presigner": "<3.729.0", "@fortawesome/fontawesome-free": "~6.7.0", - "@hey-api/client-axios": "0.6.0", + "@hey-api/client-axios": "^0.6.0", "@popperjs/core": "~2.11.8", "ajv": "~8.17.0", "bootstrap": "~5.3.0", @@ -47,12 +47,12 @@ "@types/sortablejs": "^1.15.7", "@vitejs/plugin-vue": "~5.2.0", "@vue/eslint-config-prettier": "~10.2.0", - "@vue/eslint-config-typescript": "~14.3.0", + "@vue/eslint-config-typescript": "~14.4.0", "@vue/tsconfig": "~0.7.0", - "eslint": "~9.19.0", + "eslint": "~9.20.0", "eslint-plugin-vue": "~9.32.0", "highlight.js": "^11.9.0", - "prettier": "~3.4.0", + "prettier": "~3.5.0", "sass": "^1.66.0", "typescript": "~5.7.0", "vite": "~6.1.0", @@ -1047,12 +1047,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", - "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", + "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.7" + "@babel/types": "^7.26.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -1062,9 +1062,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", - "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", + "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -1671,9 +1671,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.19.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.19.0.tgz", - "integrity": "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==", + "version": "9.20.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz", + "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==", "dev": true, "license": "MIT", "engines": { @@ -1714,9 +1714,9 @@ } }, "node_modules/@hey-api/client-axios": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@hey-api/client-axios/-/client-axios-0.6.0.tgz", - "integrity": "sha512-+wLcSx0K47168Xxx6EzNEWcJjFFAGDEjp9SqKgHg343uls41Ob6EACp/Ouozj4UMP5En+Anq70pDRNDVRY3MVQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@hey-api/client-axios/-/client-axios-0.6.1.tgz", + "integrity": "sha512-1rvO7L5l4fHCqJJlvr1bOFWR1XcjGgdPnqzTODRuOHdrighyCjt9lP2MR7wVQbGO+EjYM0qNIs5E1qxt12rwqA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/hey-api" @@ -1744,9 +1744,9 @@ } }, "node_modules/@hey-api/openapi-ts": { - "version": "0.64.1", - "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.64.1.tgz", - "integrity": "sha512-d9FWyJKjyH4KeCjOoR5x8+zKER7h7EIRzk3Xo5a2ShAxNoq9HlAArLbWgJFnH7QypQ+f3q29mTp/z2Zw0XkP9g==", + "version": "0.64.3", + "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.64.3.tgz", + "integrity": "sha512-V/7KUq59T9uu4QXMminBlqWqoVqLggDSakRdHuJX+QRSkMUhso1d4QuMEzQcvaKt0uMQdHktPd1bdc2k5puH+g==", "dev": true, "license": "MIT", "dependencies": { @@ -2284,9 +2284,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.5.tgz", - "integrity": "sha512-JXmmQcKQtpf3Z6lvA8akkrHDZ5AEfgc2hLMix1/X5BhQbezBQ0AP5GYLdU8jsQRme8qr2sscCe3wizp7UT0L9g==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.6.tgz", + "integrity": "sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==", "cpu": [ "arm" ], @@ -2298,9 +2298,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.5.tgz", - "integrity": "sha512-9/A8/ZBOprUjkrJoP9BBEq2vdSud6BPd3LChw09bJQiEZH5oN4kWIkHu90cA0Cj0cSF5cIaD76+0lA+d5KHmpQ==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.6.tgz", + "integrity": "sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==", "cpu": [ "arm64" ], @@ -2312,9 +2312,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.5.tgz", - "integrity": "sha512-b9oCfgHKfc1AJEQ5sEpE8Kf6s7aeygj5bZAsl1hTpZc1V9cfZASFSXzzNj7o/BQNPbjmVkVxpCCLRhBfLXhJ5g==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.6.tgz", + "integrity": "sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==", "cpu": [ "arm64" ], @@ -2326,9 +2326,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.5.tgz", - "integrity": "sha512-Gz42gKBQPoFdMYdsVqkcpttYOO/0aP7f+1CgMaeZEz0gss7dop1TsO3hT77Iroz/TV7PdPUG/RYlj9EA39L4dw==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.6.tgz", + "integrity": "sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==", "cpu": [ "x64" ], @@ -2340,9 +2340,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.5.tgz", - "integrity": "sha512-JPkafjkOFaupd8VQYsXfGFKC2pfMr7hwSYGkVGNwhbW0k0lHHyIdhCSNBendJ4O7YlT4yRyKXoms1TL7saO7SQ==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.6.tgz", + "integrity": "sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==", "cpu": [ "arm64" ], @@ -2354,9 +2354,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.5.tgz", - "integrity": "sha512-j6Q8VFqyI8hZM33h1JC6DZK2w8ejkXqEMozTrtIEGfRVMpVZL3GrLOOYEUkAgUSpJ9sb2w+FEpjGj7IHRcQfdw==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.6.tgz", + "integrity": "sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==", "cpu": [ "x64" ], @@ -2368,9 +2368,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.5.tgz", - "integrity": "sha512-6jyiXKF9Xq6x9yQjct5xrRT0VghJk5VzAfed3o0hgncwacZkzOdR0TXLRNjexsEXWN8tG7jWWwsVk7WeFi//gw==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.6.tgz", + "integrity": "sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==", "cpu": [ "arm" ], @@ -2382,9 +2382,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.5.tgz", - "integrity": "sha512-cOTYe5tLcGAvGztRLIqx87LE7j/qjaAqFrrHsPFlnuhhhFO5LSr2AzvdQYuxomJMzMBrXkMRNl9bQEpDZ5bjLQ==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.6.tgz", + "integrity": "sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==", "cpu": [ "arm" ], @@ -2396,9 +2396,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.5.tgz", - "integrity": "sha512-KHlrd+YqmS7rriW+LBb1kQNYmd5w1sAIG3z7HEpnQOrg/skeYYv9DAcclGL9gpFdpnzmiAEkzsTT74kZWUtChQ==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.6.tgz", + "integrity": "sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==", "cpu": [ "arm64" ], @@ -2410,9 +2410,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.5.tgz", - "integrity": "sha512-uOb6hzDqym4Sw+qw3+svS3SmwQGVUhyTdPKyHDdlYg1Z0aHjdNmjwRY7zw/90/UfBe/yD7Mv2mYKhQpOfy4RYA==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.6.tgz", + "integrity": "sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==", "cpu": [ "arm64" ], @@ -2424,9 +2424,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.5.tgz", - "integrity": "sha512-pARu8ZKANZH4wINLdHLKG69EPwJswM6A+Ox1a9LpiclRQoyjacFFTtXN3akKQ2ufJXDasO/pWvxKN9ZfCgEoFA==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.6.tgz", + "integrity": "sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==", "cpu": [ "loong64" ], @@ -2438,9 +2438,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.5.tgz", - "integrity": "sha512-crUWn12NRmCdao2YwS1GvlPCVypMBMJlexTaantaP2+dAMd2eZBErFcKG8hZYEHjSbbk2UoH1aTlyeA4iKLqSA==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.6.tgz", + "integrity": "sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==", "cpu": [ "ppc64" ], @@ -2452,9 +2452,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.5.tgz", - "integrity": "sha512-XtD/oMhCdixi3x8rCNyDRMUsLo1Z+1UQcK+oR7AsjglGov9ETiT3TNFhUPzaGC1jH+uaMtPhxrVRUub+pnAKTg==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.6.tgz", + "integrity": "sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==", "cpu": [ "riscv64" ], @@ -2466,9 +2466,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.5.tgz", - "integrity": "sha512-V3+BvgyHb21aF7lw0sc78Tv0+xLp4lm2OM7CKFVrBuppsMvtl/9O5y2OX4tdDT0EhIsDP/ObJPqDuEg1ZoTwSQ==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.6.tgz", + "integrity": "sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==", "cpu": [ "s390x" ], @@ -2480,9 +2480,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.5.tgz", - "integrity": "sha512-SkCIXLGk42yldTcH8UXh++m0snVxp9DLf4meb1mWm0lC8jzxjFBwSLGtUSeLgQDsC05iBaIhyjNX46DlByrApQ==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.6.tgz", + "integrity": "sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==", "cpu": [ "x64" ], @@ -2494,9 +2494,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.5.tgz", - "integrity": "sha512-iUcH3FBtBN2/Ce0rI84suRhD0+bB5BVEffqOwsGaX5py5TuYLOQa7S7oVBP0NKtB5rub3i9IvZtMXiD96l5v0A==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.6.tgz", + "integrity": "sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==", "cpu": [ "x64" ], @@ -2508,9 +2508,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.5.tgz", - "integrity": "sha512-PUbWd+h/h6rUowalDYIdc9S9LJXbQDMcJe0BjABl3oT3efYRgZ8aUe8ZZDSie7y+fz6Z+rueNfdorIbkWv5Eqg==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.6.tgz", + "integrity": "sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==", "cpu": [ "arm64" ], @@ -2522,9 +2522,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.5.tgz", - "integrity": "sha512-3vncGhOJiAUR85fnAXJyvSp2GaDWYByIQmW68ZAr+e8kIxgvJ1VaZbfHD5BO5X6hwRQdY6Um/XfA3l5c2lV+OQ==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.6.tgz", + "integrity": "sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==", "cpu": [ "ia32" ], @@ -2536,9 +2536,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.5.tgz", - "integrity": "sha512-Mi8yVUlQOoeBpY72n75VLATptPGvj2lHa47rQdK9kZ4MoG5Ve86aVIU+PO3tBklTCBtILtdRfXS0EvIbXgmCAg==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.6.tgz", + "integrity": "sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==", "cpu": [ "x64" ], @@ -3684,15 +3684,15 @@ } }, "node_modules/@vue/eslint-config-typescript": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.3.0.tgz", - "integrity": "sha512-bOreIxlSC/xsUdhDdKIHb1grwJah+IokNeJ50LqA1StdOHeSPUxSIPNxyKgRx4YdjhyzC6TKtrCf6yYK99x3Uw==", + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.4.0.tgz", + "integrity": "sha512-daU+eAekEeVz3CReE4PRW25fe+OJDKwE28jHN6LimDEnuFMbJ6H4WGogEpNof276wVP6UvzOeJQfLFjB5mW29A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^8.20.0", + "@typescript-eslint/utils": "^8.23.0", "fast-glob": "^3.3.3", - "typescript-eslint": "^8.20.0", + "typescript-eslint": "^8.23.0", "vue-eslint-parser": "^9.4.3" }, "engines": { @@ -4889,18 +4889,18 @@ } }, "node_modules/eslint": { - "version": "9.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.19.0.tgz", - "integrity": "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==", + "version": "9.20.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.0.tgz", + "integrity": "sha512-aL4F8167Hg4IvsW89ejnpTwx+B/UQRzJPGgbIOl+4XqffWsahVVsLEWoZvnrVuwpWmnRd7XeXmQI1zlKcFDteA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.10.0", + "@eslint/core": "^0.11.0", "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.19.0", + "@eslint/js": "9.20.0", "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -5061,6 +5061,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/@eslint/core": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz", + "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -6856,9 +6869,9 @@ } }, "node_modules/prettier": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", - "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.0.tgz", + "integrity": "sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==", "dev": true, "license": "MIT", "bin": { @@ -7105,9 +7118,9 @@ } }, "node_modules/rollup": { - "version": "4.34.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.5.tgz", - "integrity": "sha512-GyVCmpo9z/HYqFD8QWoBUnz1Q9xC22t8tPAZm/AvAcUg2U2/+DkboEvSioMwv042zE4I9N3FEhx7fiCT2YHzKQ==", + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.6.tgz", + "integrity": "sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7121,25 +7134,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.34.5", - "@rollup/rollup-android-arm64": "4.34.5", - "@rollup/rollup-darwin-arm64": "4.34.5", - "@rollup/rollup-darwin-x64": "4.34.5", - "@rollup/rollup-freebsd-arm64": "4.34.5", - "@rollup/rollup-freebsd-x64": "4.34.5", - "@rollup/rollup-linux-arm-gnueabihf": "4.34.5", - "@rollup/rollup-linux-arm-musleabihf": "4.34.5", - "@rollup/rollup-linux-arm64-gnu": "4.34.5", - "@rollup/rollup-linux-arm64-musl": "4.34.5", - "@rollup/rollup-linux-loongarch64-gnu": "4.34.5", - "@rollup/rollup-linux-powerpc64le-gnu": "4.34.5", - "@rollup/rollup-linux-riscv64-gnu": "4.34.5", - "@rollup/rollup-linux-s390x-gnu": "4.34.5", - "@rollup/rollup-linux-x64-gnu": "4.34.5", - "@rollup/rollup-linux-x64-musl": "4.34.5", - "@rollup/rollup-win32-arm64-msvc": "4.34.5", - "@rollup/rollup-win32-ia32-msvc": "4.34.5", - "@rollup/rollup-win32-x64-msvc": "4.34.5", + "@rollup/rollup-android-arm-eabi": "4.34.6", + "@rollup/rollup-android-arm64": "4.34.6", + "@rollup/rollup-darwin-arm64": "4.34.6", + "@rollup/rollup-darwin-x64": "4.34.6", + "@rollup/rollup-freebsd-arm64": "4.34.6", + "@rollup/rollup-freebsd-x64": "4.34.6", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.6", + "@rollup/rollup-linux-arm-musleabihf": "4.34.6", + "@rollup/rollup-linux-arm64-gnu": "4.34.6", + "@rollup/rollup-linux-arm64-musl": "4.34.6", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.6", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.6", + "@rollup/rollup-linux-riscv64-gnu": "4.34.6", + "@rollup/rollup-linux-s390x-gnu": "4.34.6", + "@rollup/rollup-linux-x64-gnu": "4.34.6", + "@rollup/rollup-linux-x64-musl": "4.34.6", + "@rollup/rollup-win32-arm64-msvc": "4.34.6", + "@rollup/rollup-win32-ia32-msvc": "4.34.6", + "@rollup/rollup-win32-x64-msvc": "4.34.6", "fsevents": "~2.3.2" } }, diff --git a/package.json b/package.json index a2f35af..ea363e1 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "@aws-sdk/lib-storage": "<3.729.0", "@aws-sdk/s3-request-presigner": "<3.729.0", "@fortawesome/fontawesome-free": "~6.7.0", - "@hey-api/client-axios": "0.6.0", + "@hey-api/client-axios": "^0.6.0", "@popperjs/core": "~2.11.8", "ajv": "~8.17.0", "bootstrap": "~5.3.0", @@ -50,12 +50,12 @@ "@types/sortablejs": "^1.15.7", "@vitejs/plugin-vue": "~5.2.0", "@vue/eslint-config-prettier": "~10.2.0", - "@vue/eslint-config-typescript": "~14.3.0", + "@vue/eslint-config-typescript": "~14.4.0", "@vue/tsconfig": "~0.7.0", - "eslint": "~9.19.0", + "eslint": "~9.20.0", "eslint-plugin-vue": "~9.32.0", "highlight.js": "^11.9.0", - "prettier": "~3.4.0", + "prettier": "~3.5.0", "sass": "^1.66.0", "typescript": "~5.7.0", "vite": "~6.1.0", diff --git a/src/client/sdk.gen.ts b/src/client/sdk.gen.ts index cde07fd..7d7ab82 100644 --- a/src/client/sdk.gen.ts +++ b/src/client/sdk.gen.ts @@ -306,6 +306,11 @@ export type Options< * custom client. */ client?: Client; + /** + * You can pass arbitrary values through the `meta` object. This can be + * used to access values that aren't defined as part of the SDK function. + */ + meta?: Record<string, unknown>; }; export class AuthService { diff --git a/src/client/types.gen.ts b/src/client/types.gen.ts index a795751..c9c0003 100644 --- a/src/client/types.gen.ts +++ b/src/client/types.gen.ts @@ -171,7 +171,7 @@ export type BucketOut = { /** * UID of the owner */ - owner_id: string; + owner_id: string | null; /** * Flag if the bucket is anonymously readable */ diff --git a/src/components/modals/DeleteUserModal.vue b/src/components/modals/DeleteUserModal.vue new file mode 100644 index 0000000..3a3acaf --- /dev/null +++ b/src/components/modals/DeleteUserModal.vue @@ -0,0 +1,109 @@ +<script setup lang="ts"> +import { computed, onMounted, ref } from "vue"; +import { Modal } from "bootstrap"; +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; +import type { UserOut } from "@/client"; +import { useSettingsStore, useUserStore } from "@/stores"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; + +const props = defineProps<{ + modalId: string; + user: UserOut; +}>(); + +const confirmDelete = ref<string>(""); +const emit = defineEmits<{ + (e: "confirm-delete", uid: string): void; +}>(); + +const userRepository = useUserStore(); +const settings = useSettingsStore(); + +let deleteModal: Modal | null = null; +const randomIDSuffix = Math.random().toString(16).substring(2, 8); + +function modalClosed() { + confirmDelete.value = ""; +} + +function deleteUser() { + emit("confirm-delete", props.user.uid); + deleteModal?.hide(); + confirmDelete.value = ""; +} + +const confirmDeleteString = computed<string>( + () => + props.user.display_name + .replace(/([a-z])([A-Z])/g, "$1-$2") + .replace(/[\s_]+/g, "-") + .toLowerCase() + + "_" + + randomIDSuffix, +); + +const deleteCurrentUser = computed<boolean>( + () => props.user.uid === userRepository.currentUID, +); + +onMounted(() => { + deleteModal = Modal.getOrCreateInstance("#" + props.modalId); +}); +</script> + +<template> + <bootstrap-modal + :modal-id="props.modalId" + :static-backdrop="true" + size-modifier-modal="lg" + modal-label="Confirm Delete User Modal" + v-on="{ 'hidden.bs.modal': modalClosed }" + > + <template #header>Are you absolutely sure?</template> + <template #body> + <div v-if="deleteCurrentUser"> + <div class="text-danger"> + <font-awesome-icon icon="fa-solid fa-circle-exclamation" /> + You are about to delete your account. You won't have access anymore + to: + </div> + <ul> + <li>Your data buckets and their content</li> + <li>Your workflow executions and their parameterization</li> + <li v-if="userRepository.workflowDev"> + Your workflows and their KPIs + </li> + <li v-if="userRepository.resourceMaintainer">Your CloWM resources</li> + </ul> + </div> + <p> + Enter the following to confirm: <br /><code + class="rounded p-1" + :class="{ + 'bg-light': settings.lightThemeActive, + 'text-bg-secondary': !settings.lightThemeActive, + }" + >{{ confirmDeleteString }}</code + > + </p> + <div> + <input v-model="confirmDelete" type="text" class="form-control" /> + </div> + </template> + <template #footer> + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> + Cancel + </button> + <button + type="button" + class="btn btn-danger" + :disabled="confirmDelete !== confirmDeleteString" + @click="deleteUser" + > + Yes, delete account + </button> + </template> + </bootstrap-modal> +</template> + +<style scoped></style> diff --git a/src/components/object-storage/modals/DownloadObjectsModal.vue b/src/components/object-storage/modals/DownloadObjectsModal.vue index f2a5d42..4e0ba36 100644 --- a/src/components/object-storage/modals/DownloadObjectsModal.vue +++ b/src/components/object-storage/modals/DownloadObjectsModal.vue @@ -212,6 +212,7 @@ async function downloadFiles() { downloadState.controller = new AbortController(); downloadState.downloadedFiles = new Set<string>(); downloadState.errorFiles = new Set<string>(); + let downloadError = false; outer: for (const file of objKeys.value) { let subHandle = dirHandle; const subFolders = file.fileName.split("/"); @@ -245,11 +246,10 @@ async function downloadFiles() { downloadState.controller, ); downloadState.downloadedFiles.add(file.fileName); - downloadModal?.hide(); - successToast?.show(); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore } catch (caught: Error) { + downloadError = true; downloadState.errorFiles.add(file.fileName); await writeStream.truncate(0); if (caught.name === "AbortError") { @@ -260,6 +260,10 @@ async function downloadFiles() { await writeStream.close(); } } + if (!downloadError) { + successToast?.show(); + downloadModal?.hide(); + } downloadState.controller = undefined; downloadState.downloading = false; } diff --git a/src/stores/users.ts b/src/stores/users.ts index c05c2e5..7eab462 100644 --- a/src/stores/users.ts +++ b/src/stores/users.ts @@ -258,5 +258,11 @@ export const useUserStore = defineStore("user", { return uids.map((uid) => nameStore.getName(uid)!); }, + deleteUser(uid: string): Promise<void> { + // return Promise.resolve(); + return UserService.userDeleteUser({ + path: { uid: uid }, + }).then((response) => response.data!); + }, }, }); diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue index 2fc7156..4a3295c 100644 --- a/src/views/user/ProfileView.vue +++ b/src/views/user/ProfileView.vue @@ -1,7 +1,68 @@ -<script setup lang="ts"></script> +<script setup lang="ts"> +import { useUserStore } from "@/stores"; +import BootstrapToast from "@/components/BootstrapToast.vue"; +import DeleteUserModal from "@/components/modals/DeleteUserModal.vue"; +import { environment } from "@/environment.ts"; +import { onMounted } from "vue"; +import { Toast } from "bootstrap"; + +const userRepository = useUserStore(); +const props = defineProps<{ + linkSuccess?: boolean; + linkError?: string; +}>(); +let successToast: Toast; +let errorToast: Toast; + +function deleteCurrentUser(uid: string) { + userRepository.deleteUser(uid).then(() => { + alert("Your account was deleted. You will be redirect to the home page."); + window.location.replace(`${environment.API_BASE_URL}/auth/logout`); + }); +} + +onMounted(() => { + successToast = Toast.getOrCreateInstance("#profile-success-toast"); + if (props.linkSuccess) { + successToast?.show(); + } + errorToast = Toast.getOrCreateInstance("#profile-error-toast"); + if (props.linkError) { + errorToast?.show(); + } +}); +</script> <template> - <div>My Profile</div> + <bootstrap-toast toast-id="profile-success-toast" color-class="success" + >Success + </bootstrap-toast> + <bootstrap-toast toast-id="profile-error-toast" color-class="danger" + >Error: {{ props.linkError }} + </bootstrap-toast> + <delete-user-modal + modal-id="profile-delete-user-modal" + :user="userRepository.user ?? { display_name: '', uid: '' }" + @confirm-delete="deleteCurrentUser" + /> + <div class="row border-bottom mb-4"> + <h2 class="mb-2">My Profile</h2> + </div> + <div class="row border-bottom mb-4"> + <h3 class="mb-2 text-danger">Delete my profile</h3> + </div> + <p> + This action deletes your account and you lose access to everything in CloWM + that is connected to your account. <b>There is no going back.</b> + </p> + <button + role="button" + class="btn btn-danger" + data-bs-toggle="modal" + data-bs-target="#profile-delete-user-modal" + > + Delete account + </button> </template> <style scoped></style> -- GitLab From 38d82d694dfdcf64b6d06d13bd1ee53519c9b0d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Mon, 10 Feb 2025 13:53:09 +0000 Subject: [PATCH 03/25] Add roles section on profile page * Add iam4nfdi logo #191 --- src/assets/images/nfdi-aai.png | Bin 0 -> 71321 bytes src/components/modals/DeleteUserModal.vue | 18 ++- src/views/LoginView.vue | 18 +-- src/views/user/ProfileView.vue | 142 +++++++++++++++++++--- 4 files changed, 152 insertions(+), 26 deletions(-) create mode 100644 src/assets/images/nfdi-aai.png diff --git a/src/assets/images/nfdi-aai.png b/src/assets/images/nfdi-aai.png new file mode 100644 index 0000000000000000000000000000000000000000..32533fd2c625f6140307b030c2fe3d78e92e9305 GIT binary patch literal 71321 zcmeFZcT`l{vNzf^P0mrGG*KjWlY``pM9C^SXC#B<jG!a~A|Oe!WC@a*B!VD_B*`ck z$tXFz)zIyBpL_2)cZ~17@BOpq7)r0zHLGgYtg2ttTrA>sv{Z=j>F_}y5Rsay;x!Nm zR~iHYv*2O_cevs+UV}hF0@jxD#>k&eKCV{4?Tf%q8*2d%OAr}|Gz<hP1&KYmg?V-Z zpdv(3shm@}{+-Il(@nz1$I(W@QWPdEC@LV#YbPQI=M@sL65tgVwzTFIv$PemwiXk$ zv=OreWMLGd*j+wnXX*7{gz{N>dD(h;JG#4h0TV#|s0kcr6Rg}l|C<Tczo|2=0g7CE z%kw+o`F7`@oRO>Hv$b*bwzYBfa<}vLv-Gr;v$u8gc9pYnx3YyQJ9^sMxdhy@akO{z zwsg^R_wls0)erEn^;dTA_V$qA=ePFdbM)}G=5zP7=XbO9^RjlgvGw9d(R-cIdjs_R z-kz3@ZnidZF81!8j@}Ngj@FuhT;$rzP%Gj5pI72w>E*y@W9f|~2i-=l<(ZSMzqN~x z7t$QzdA45OmY&`;%yureZuZ^|v_jH0ZkDdLZb;5{P*+PgM>~MT+S0||&db44Kv={E z$<Y{^+TKnaPm$%Az>vz$?mt<RF4v#>EOp*K{q|_Vme+$xYY$5sRiw=G0meb8%66uz zfVIniHM+HnrK2lAjxmi?v)IALTEg4W+r`#h#n#Q%(-JT=RL#}W-qsQL!p_~()zaJ1 z5qZt;;b!mT=mspr&DvH?(VxfP)kDG&@E|KOTTyF4VQXG-OEEiMAv?Gouehy^H7`s| zT+mX?Mnpi!R>=KKsyVQ6ND=Oy{vv1FXRhV~m<X^uaEo6+j1LC2MDD6Na@YA`e4>0J zP~=BmPcPs~K$uU!`(OB&JG$Aqhqs>@^VYdX{K3-R*VYrc0X9h1r;c8Z_HLHmKAyJz zv|hF@cC2T{mpb#X-(NZX<-`$r);^vt{+Irh_Ad(lv$-grMeW#+a=S&R$frRTncu{J zos6@}MHHEGcc+q*D*t4$8RqUdXL|WRG5zgOD7MR8*H!3a0?j$ZNMtgNc9P767A~eG z7blvh$?Di#zgPQ*>wrKoQj{B<d#r%<e-o^~R}8oU{{qq#Mxsmz*YhyM*l3s|Ot7V3 z5!m9e2ncfyCKv+@CZ)Q2da0asq>=rqmbK_b#%vf7HXc`uYRoPX1_l8Z2<8JPfZ<_d z8bGiqzy^A7Rv0t#0-u8Jd{^`Wyu58)y`XAt*6yAj?q_}mXN1usi3lht&x!Os0cU{f z*?RgqTHAWTSzu7)*O(Nv=U?l1y4(0z|3v^*5rkd5KqMdphrxwmXX83>DU7@n5EK>{ z7QYS)FN0IS$j;ah;-9lo5YUl>bHX^zL=!S8xVw1+`2;HG<Lv<abhLK#4gl12^mYV1 z-`5sB9Una%SOFiL3`T;Sjzfs6XXyr2clY{Dhf9dBVCmurM2?%I<=<@rg<bq@Gdv7x zGHXjmUUv^KSxcnP^I5yQ!XhwO{<JFw76>x}g9HTJ#|KAXV1T+vJHm&9r98jEy*55a zT3E>$5^n!;ytEoS`r%5XR^1YNOqTmcrd&a4Luzr_S#sT%QQ;NcsTR~xA<zLXZkCg- z>PFpuEc4Sx*VkvcK2`9@3VX7b!n2qYvm9PUJD)hT+&q1fl&UAia4Ye9*N+iQ$&^0k zqC&hDI)@Wg`J4QkaZD2Tf4vZxnPwThTWswvkQ7|zrcmk+8WGIWDvnTp7>+?{R6X#f z=<Ne(ZfAnh3&koOYVZQ@Als=E{FJw}ED&RlYve;$rzQ4bMMK*9Hho5}@7m+8<<Bbg z=!kuf)!?PZ5u6VDan0~y;AL0NK)!wpm6u%GZPqdGZd{Z4eoGvTi2=gMkHAO-ED{GJ z1h#;Y0t4d|0)~NL#K<cW<P`)Hj1vaf8n|YMT!2xbjLwgNL5PjZjg5hYg@Xx!h2KLG zKq28Vu<%G&c-U_$Fec0kb_-1j2E%L#txep0paAkf-Q2yQ9=4vYj^4;T>Fo~n@v?<_ zJ2-klH2{}&11=Ph5NPLU4J1-1fB?20-cU=gKjv5k0Q9y{7Zkary{D}$00iEAFjJ&H zOb|nuKI~eKPL5WL1`5GEoE>?sJze;`0$eQtCq;S+zqO^gsHL#Ape4*&R1gjq6@rOa z+StIw1>pi#)^ICp0YN){4L}DkZ-r|be86m&D0)R07!YpQW!NS3H4Gz${trp+)?OZe zih?mA^<st4z^KD0jV=cYXbzk#32Pyk*u36)>6Ohp{pqnlCcumUV}MGV0x9dHy+$S- zk69ww7RYO_{t76J|C%-zr%v^wZ-(M_iX$z_%`dJuMa_Kn>mhVpm0|JFXWlc$q^0-w z>00?(U(z_RV?l*#H&&)Jq$iu~wVYT%9<ejrV@i$641rTMv_&C=92fLQQl1s8%qT`T z2Y2AJkoFO%;Uq5dfty!vf4$l5$6xzac1g)8TXl)}B)8s#-r;16YhDf<T6RD^Udwh@ z-uO-~q{4xNi(I&71@D@rQ|suhN`;9V`2i0a(;SBI`?f3CK2tw4e=)oCfqhh-ctft6 z!E`H}W$bao!0J<Zn%vAj=bOQgCfsl4;I&L+=1cPteIMDDaUN)f$RE9#V4c>=mOd>> z)4(dv%~{P*ws_)mQoTE5?z0Uuc{&jO(ef9o^W%PQyOo8LU-jIfW7<6=E~XDNKd67# zEoQ|YTBZo_yuwl&V9RuJp?{>tMpk|DO9bI5LNc=hvCLjCc1&J6Lx)I+m`bn34aJx7 zso7tKEknQDX1MfO9s7xw!M)+)k25dY4IU5u(rvlUj=k^nTvRU^ifu=w@X*H_o3~h+ zRWHL{$B0ePg@b)2(&m*AWt8+iF|f*)p94KK<>AX$%V2XvOzO{^9Gs(yAH4s3IAgpy zA53z5u!-%mxilp!PobVV5ON{$*HwhT_}w%}Jexnp4U#J@p_{jwxlOR20r-&%;72?P zKM0HK^>4?29>I?H8BBN*|M6eE2IlhjT>1Y7e$c`$0Imz*2kCj@zvd1^uYw#@MF0sK za1l6MK>Rms2*H6%F*I!a|Ab}{;QyNc!N~j%2J$};Rt-#it*v;qH&tCu2qP<8Fuv>h zvloO(#}`%C#Mw;k#QTQt?=x;cIPy=wn|^O-X^p`^n#k+A-`i^PVk&=IjfYz}wCmlB zo#C%GF-<?{-Mk3kG1DXM5xS7R?>{Ftx;$Nf=IuU8CQ^9(Yp>I(G6`ZlvixXH#O32D zTZjNcC^4_tq;y1)S&5QPp9<?K7`%0JrCP#gSezg$iNgAubDg<7#zbfwlc}Lc5jC0Z zz(;A;*y5{i+~xglaq7E%?ddVg><A@&jX5>;sW(#JRZwnXPin6_P?T6BCfnwOXsYfV z9FxZNC8$l?J5rr8iv3We^lP4y+^V^^rFiFyTD|yiX_u*?Tl9RP%~XyaU^;HAJi-U# z^9-6>K0_Irnrb)NpU|5-W$bDFjCZ3OU6mCrrKH&jA%5yi&t&jRo1~dnv|uAAY&m%$ zYLQHu<?_*!pxwaYcEj$^H8xH-RFO)h_n4$aNHZWLRDJY*dHc$*S+ayp@ALb9`Mj%C zEiPGFQnF)LFl0W`WH8wsd%$1WqU4qF!Y4yot-|wT_n6>Y|C5o?IW?_t`PxDDNvWs? zI?|gKDW5vqZwZrq5e^L|$@Pw`&AWSvI^@v$6{DY{<SCOJMf>H9*u<yA4@_ex@Ry?^ zq)XN$Ztx}Q2t+61-CT}reW*XFMy+49m~#~THhXXpjekM_{=s16$i#exf4DGg0Qdk0 zfeD|32p^0G#+AdF!x6)VZi4^-`CVx6pMCNK;=x|v3>^Ljo*39LN+cV02oa3nH!Nb{ zz>JW0p%5LI7EI&!eE=?HU{Yu>0b@|ZkrKUt&dblw?+=l#j$YRM0F?220A-xHm#;NY z=6iVYIe5Fez}S$C$sj;ISO5eqoC-z(+yDZXP|rkDfmaA7F2XA)2xCN25ksgU|2+)- ziBp9Pi>~@?8pTPfp6zZWiDOGE@X>$CIA=I@>+Ld5V&M$$%<Bb7TQg8<_=6u0plp>- z9mP!hf;Jnco@s(?CD}V@Zf3WcG|bRrOPWNo9|$(HY-zhUGv73%{?*hMNp*Pth44Zy z+><twXIwa7EiQ`O*Sc%lrd$8=r2u>-GHD_bNOk_uR?3kC6BAR+$J+O}i}#cg&8!-{ z$BkG%Q{8GQVrYq%gh{vBidF@ujR>w%XZMJPD%<%rTDa2b_t{^hSBa&5q|aITfyzN8 zQCNPupAp|HX#0suR_CKO7G7>;{cA}GmPsWpV@0#R@4v1c2N^E3tc%(m=*!>p+_Dq( zTr48fedJ3s=$_RX#Ot;={>{oZLv-Gy>4hM951nr7a!&2M!BLk)y2zX9-8EU$H%EMC zt#vOxOX@wZPTEC84C<)+>(}d11aUnHIEw1)e2|{U%^`oaW{*NG;z3IY7G)xn--G<( zh1NCU<E;iNOfgwj)zp;o72{9*{3Uh#@o(5mZyml>t~NNb&cR7n*mJXpdW8GzYYxf2 zN)?-N)#s)vBPT^w4`!>+YR;M+TOYi$W|J>T_R-nRVL$s`V6LTnxkvC;cX{RICOS3= zxXSeE^{R%rsbRk{_io<zX4ADfzTaQkmxd#_0)9pBtd(aGlm0ZhF!&=LT<fO3{W=C@ zZ8!;K(hzEMUruMEiQ}J~u*@d7uwZp<ceXjt4(NmQy}WZBy}i8k-JO9FE<D%T*V4s= zSOOM7ECK_XA0Yh_^P=3H2m=S46G40txJ3uXz=V?^oysCc6~h)20tU);Sa<|B0je#+ zBgKH^ctLK#+`$+a=TtGrE;tx4_`ghoK-s#ZES$-C{p6{aA92XO{ubV@zFzSJW8PS= z-ZR~NHw#QE8Q4QNH9}E1)~54BoS7klhC~1cG(K<v0k{xMP+0If7!NdMn6(nTA)cNS zL4bfoVBrI>v4uuo0{-4W|Dl(wwubs08ElyU5(_ZvzoRd*Xa)ihpMqEsI9EZIv^>bp zjSnsf6F-kk0rVHpv!)FwhE;^1*YxC&u?p2wl>?42p!$xkwtC){t{#qV_5kjpdNsJf zIp)HEUQJL0CIA;lgYJ#LD}m~<@F{T7vf$!C6?>K#U`h%KfC%$*N#;mNz`=y8hxs*I zFAt#MxAinX!+disZ9{XUrC=sNPQd|o=B*SM0~`13111IzraTBTd~`8-FFd`FD_OQh zE2M<-@zQ5Cs>ef=5e=AErd~fh=9q96=T%{*egdYdT_@oXGx*8Jq?6SEwYgP&)F;?y z2J|BdKt7KBFCEC=`x9zp_F_l&CxkG3bh^aEJ?n9SqzdFc7%n!peK;Wo(9Qs97wJ{! z{_<yHdrAGlRWq93>#}bKzfYnQG%5SF`yYvM<sE~2(3c#|CAds12zT`PXs}2#>^f31 z6GRWD3)9Zg%()t)_7^4y^4S18Yz^%2SzCd&G-^{-giu?0Zs$KYR6*_xIKq?BO99%7 zvpxz)=BOqMXe?+@lFpinKPAD8e^Y^fH#*jqNJYH<k5uyh7uP;Z^LZ;B(5(P|-m(PN z22hf#LWCEjf{`P8`1#^n-fDMGc5G9-WBUzF)27cg?s+Wsed$hiuQTfAnyyvRJtJop z(Tg{BrJ~p!Bt0fhvDwq`m(lcQ=2kgg`1KI{($#3nT9tpWlT7xw6Os5GD;ctFBrY3i zEj=Xcxph_STGnyT;lNi1`Gf7a;jM`WMB0zmbT8D0aDjvg$b=&c4LlelZTeTf@mk14 zF>M@$I~`_vGb^U?kz`|wh&|4H|HU%s;DY}l_G*Tqaak)y7`T6Yy5@TfiA}Xzh(mkM z?!IRU9pQ7Ukv9>Ma^<U6n3A~qE_$r$u8#M)6OTd+Z1?P5IjV^D=C144YVxP6+++C> zIxIGHq3OfAN$LIjYqD#r(`07*ZH+YpX7HY?OrJ*HsCv;3Ghrqy5bG*0<BSCfcS%LW zIlpF@;IwMu3Q<1L>WtTGS|!d`r!4gQG>t)CH*1dNz&s~-b(iXh*je&g)pEYpsW1ip zD4S~+bi3!(^*j#8__&MY{EWH6Sr@d8IqKx;Hru!^%G`7OboAYC%h{mTCFg1s7Mto7 z#uG!9sT>ol$M^O9k2WqRY-u$FMz$6jzVnx^pKj;1DQ4%WP9C5x*_{#c7VQ=+)%aNH zyB0JP_gOnY`T3yft9jwD&7H!a2w26!yVa|tjBI7F!FG#;;w>tm7pVYxk%y>kh$AA} zz@{HGsZxH-X~$)D<6m3`X7%?(gephyDG1TwflP*QRC_@{L5eJN{&a3Q^I6jj6fiWu zXQ0#MSreinbe0SSV1fdIzdH~?QQ%Sloecl4WaR(UZ@h{T##XECkn&X1HRxr>?A}Td zEqSDyJ3bQmE?XndHK%GIa{u}cS*{|Lym>*~w!=a2c4j<5Xckj8i6D~>1p$ZGL)Sf{ zVsP-WLS57p*``-@?HYGj)EyR@`5#kK-4{a3Xt|~3XYB8N*Ol5BHyr)K$@}Ad^$VXb zOxU(}?_YlZVa0L&LvpM#==QXtT>MOslTqM?Xuwm`@;6_jZ0fFU`Ks(%M$*oj*Xa{5 zJGhB5H_Mir*UYI0zx^dnZof|a%-UtCu!nI_gy`njXZqp}8*kYnglEr7EvD)h#+m^q z6G>ia<vijapQ(;-RKY1qj4nUC#P=(<FiFdo%7DWoog*}dP6ev)Nx?eowvXE-_T+R4 zF|yj7o$Sw&H&(*uSSUY4aP_9P=gfVQ&ht9>!gSr`{?@ezWZcHyvYcgJ3UBAta~Yh) zdM<DGmp=58cX(Q_T$?44KZd!`zL9sOUw(#0HI!0lXhfrI{fX2Gaia~_fe$B}+^T## zR;HcWHJzWj+ahY33D6N9BjEt<;%z017S_AQyEB$^X(!@{{TkRajfrpR>c-OVG2>2Z zlir(M^(EI$>q{h*ym5!6xPt?CpOTauGuWK9+2)h=LgAwHPN#Q`%tbukl`>OhpN|&# z#&{T<AmS+fwYT3)Uz@?mTa~k4y!UMyA$ERDI3id#SdH#COaXi|`EUD;ziRUT7McEp zu9b;T5hJ%uZ8YZj>}9^ZOs`-d(f&JTV#J&k{y^jLcZl>uV+DXQ&M?RSCBn#|XTiWR z!f3?%Umy%JLREwSbn}KOoFnHIm;_8LM<homMgYyn)8*eI=Wix1{|kWs`%(HCVg;Mr zL!{Nar<W+QV1(F>Pcq9dR?+a0YElfr^xn499QNv%e!P15(BlqK>1D?w$BrRJoNv+= zuO|tXZ{C=2jXj8hvJ1iO2kXfnx_9enSTPdfMif)GmKY9EdELceVSoF;QAWk@(9@f8 z;<QZr4o_fN^q_+IszrUNc8Xm#Pxiu{^5x^i78{OOm(<p*pkWXEp!MPwAMKadcS}fX zOuwCS>c?-4-MQs!J2kN3na_HFxD=sS@%R#b8QVpUj)pm|A3NFA0guD;4P(mimHOtp z@8*0-KRhhV@~rIc?dWj2_2Cso7+!b%)4|wSwr1^owI)BiluggfZ&$(BibO-w^vWd} zan(rf4~hrQp0Zm%zQiLX<6N|9*CjWoT`&8DnOSzYfr4#thS6VQDf{`d(5=)74(BB? zud+f6?N%8{|K}Rd54#`SUd1;T6pxkj4;1^Bxj4&u%*gq^cmL~Vy7?jZWXP6smJiRx zOFSIY?o_ug(k6&Brj35yy71Vf-(y3xJsmU;rPjW5XkkyCYxi>203mTXrYb#$d-Z`_ zgTxqBI=s#bj|9Ip`~$^Fd%?SHqYo{RgNQkSc}V;QXwbBCf0#8CM6l!w=J>E->nmS) zITlZa`*SE=K{Uxx`okRqeQu_(1H=|F_wx8*3BMwh`WFgf#%WP8x?Jv^)$yPscmzfh z5Ognq)&b`Cf2BMJlM?<nO~N0&O-}eb7~Sta2oDoZ^tV<A#_-p7Sa6cF=Q4k_Cot|m zh{1$#1{fU-I8laB?oxpDZRj)Kj_C4Q^|U{|9F=&q2jl;X6$H)#fo}Mm?&0gYHO{=^ z?D=^yp5lkkO>3V{=%p7*@&`H;pYVaU;IFO=%#VD!17m{$6Pp4#92jZ7H3eBq@2QI0 z82CJTIHjYY$di;fxO`~=RD!I;&w2sinE^x<rVM5V9na8q3;z_yIQkB=bA$|!v(Idc zD>0}AePp^HEORmV7C_RlHgtSJ*VnBk@DW{F(q|h&*1WzYYV#!!E16$7gOD-usjLY_ zB=BVIpYe|c{;|M67Wl^k|5)H33;bh&e=P8i1^%(XKNk4M0{>Xx9}E0rfqyLUj|Kj* z!2fp^*fGHXg;4uxZ{PGd&Nzw^x$w})Q<SbxSLl<IF!1DhM!D6x$|7r$2rGA!A1YbO zNasi=VHS4d3v>Uv9%y-+14{$v<okyI+@#W7fl<<UFl&2hM;nFL{12D8iN)6t5~Jsb zUKH)d>(|)TZbNWsrW&vGOn*t#@j7_fbHtfan>PJwvBhDYx`xlUXhnBKGBc;Co08qN zt`qVlg`x1R=;?b~kQkWFAz<ssI}O8BrLu^hXEUSd-gwL!L&4qn+*7+~?|$8e{+Dec z!ym4)_6~-6JpEOT7t(0aox9^Nb=5`qaM>rd|D_ox{cb6Jd*9-!P1v;2qlo)TCp!%S zww_Te#MFMBZ|jjS5#f2LngB26I2R%RVRYg#gFzrDNKH{r-#>Gu1A_>7YXCF%N$9&^ z#;aisyr?Y+Ti3?{flg0X-eKT@K!lK7>thA}-bllZatstjTIo5#6u<!l>de{Ib|n^l z9lnS98WdCt2nQJa^Zh^e`FH;D4o(!NLx_bCg@SOP7<d}02uL6-93sL1#lnMZ;b0qb ztfdyZW_UYrSAH6VY5Am9Bp#$zw(<EqDY$jz+}Rear>&2(mpE@t{18~bxM8iP1>8rv zo*Yq_EFlE(5prom9?YRd!jX(1xSX?uTfm`epK5nHy-wV^`<?NAeYxuZSy$%%oPO&C z6i1`AxJFOH&E;zMq6^fdWF+SdXW&4z;3~;6j9z=j`rHxBvEXKDe-aQwlAzzSXxNmy z{^110z@l6x?lqlafkd|~+2(I;Ku}W54v9_)YL8bqsqZ~R(?(_Ixq}?aqliPD4=$aH zM)-f}A-#e7PBxX`Y!NfncpxaDQiq1U>oPfCC4C&}RUDnQ1^(m%vc)cY^&f``3WIoz z=W{`8pW~qdQ8aG9(&K;^29Y+Hfs-MiAWVc<3H@iSbOhzY?>W~3XL57sH`;B6G7}cN zu+?36gS=@1vgUwzMh=9wcB-@rX(joE<RwfL4<e8(E+#_4KVi>klYrb9*H4Ye+s$dO zN?%4&|BLB5K!zL^>15s5YQXD@=Yokq%#?~9{8+-kmJUAd=r&MEknqH#!(|gBub;cp z8=J6n?R}}lm44#0$so}5&r=9|Zs+k4j0_HB89@12IU-=~kPfdn;qs4R$)gI)1FDUF zwLW_rVS%={`iVd7qVpBq^HNz2s<^9cAJEdt&Wx=pOGOR~mtcV2{VcW7QxRP!N+vBN zJaLgq(%%my_UjjY&@I<(-PH4Z_FHDyDbqub?ji>V3Olx&?N9XgU>dEp{vBNh!ANfa zM%bbj7U^^@9a|G{aqe#C8{C6$IE2S6hq>697!}go8LN`HV97z-?v6^G!#b-&Mxa|J zsaWUJkO>qQflQzTvkXhJL1G*zzXr9i$hx4?=nTpfX*vdgIZsX@6t41i-Y$lFFq>69 zcRv>YGnGJ~y;M-10?Ku!0Cxq<hmb&U*#RNN!LtyTJPPKSVdr0XU+uoPVN86{sW8ak z;`!7CnIA{7D(>%B`QzdMjgaPt69K*hLHI>HQU5w%CM6sm<t8SF?|2QbfWVLV<cs#) z#-d7Zz}WhDo(l!tIhQaa?Q2hcNnCmE+W<IozJ~}XDFl(Gk8_l)Ls2XX;YbeSViVFl z_^fmQ6(rtiYwn|!K7!6KAIx1Z_|yf=LXN6y^C$j4MNAzd<B&^3GU`AE0w%&`#i?S6 zgT*_XC1lAha><k~mV{)iyk~y{)<y(i6>`W<l<p^#G+k8_0WQuL0)kR1bf{YcX#f_D z#c&e+AUbMQOXa=&-i8`eExSn#_1Q!a=;lgV`^L!zm)f}pA|oDz3#r~+r^ex-34_&3 z@LdY>|Gb5wM#yU(Eu46y6riYqO#%@{!H&wZW8Y*yCyv-yOnHL}4iM{Ztdh^UKGQ(X zlLbLKh(0>BcR}ntqNoajB0=(4eTflN9t}tQ`%lJQWlG<FMLA5^1!bSv*xT8q9Ou)K zN+CmQ9akTUK`~*md`B=GGWsqPL{6t_$KX;QdWYnRdhnKcfT|G*ip2uu`d9PqR}pdP zzgdLAkXswZ{aI^Z<!ed2dU1k;EPjXV1?r3$@x7yifUa1Qolg>JE!rg0HO#2>?&YTx z{4{i5)nE%a=L5LNnTwVF7|^GP>m*NAC4wba&8qF~Z?Av<s5`#$Aokf$)MNzCu|!qv zXVNt#MF#Y23<QvzI#gv1*e$>m&v7-N;dqWTUpqU!FD+uRQ8N)sy?DU(<^>QaXX8<j z*H5DrCiJ$>Fw+9lquwRdQ7Yzi6WZd2v4czEV1nUUj|2HTznw}hcHummo1mBSM{0{4 z3)-w|H)`F>m{O4;hV+bFK!3n9w0d!kH&)jBv=N_Re$I7$X)pap4>Gh+kq!zHaH^Gl z0Ip!8NBa|CJy3^VRDwD}@dCpb-8Eb_tg7mnZ+lD8But53W@F@1X97W>jr{zVyU)Xn zew_;h_72#3g?H<qtD?+{8qm)?&<D}ShU9a4!v)TIU9oq)%=}(RGm@Xr4r>>i`x2YG zSsHjgdkP5#q>zrvx8xea4XQV8L#(YA?YYDny`xD;L<4E&i6Q3`bMh!;R>miIPD2#g z&ZnN|HB1CEm2SE$m_PGwGSmvs58o-r_00en?iBEp^KdZgd@@MZAb9ZB)#K1RaVP+g zBLkwKt7=~~+~C9uk@EHH*k*1VDsO<qY|NfArShOOgd<5ox$94-#_+R~F*hw!e$#z* z4=F|!g?~}?ke^Yhp-s)OBPgSPE_Mod^AQl6^Gn;6ghZT_sQ`sgppeNoBxAsLzy|)E zCOwH{1RZZlF3YjsQA&jaKXDONhwr1(Ra_ZvGclF^rPY#lNHGxoNM1;12Ha7?+S;xY zQkbm1fskF$l6$}3PR!)QB&gP8fqYFLIWp@$#qJ#Ct0A)na-tkr7!2^DQCh81d<s=r zrRVw`U#<}mD)><?&Au=Fjwv|TphXhg;C40{1geLpG3@%>o5#L{3ZpZSC&ffC_1QjO zW$bWdSSGtEN80)XT0p$-xmU$6HHD>%n!8XS9KxADv2XK+EahDKEU-IJQm`zY0~f1t zr>AmD(&d&}>?2wSKcCIQEBDdn|7yY3<otBscAO1`J7?1{t0llx0HPEo2lCNilVcsa zw@XMTHU*{z%l%&LNcL=h8YOC}05n4hyAejc{V{k0P^@?!1G#ku8|^2XxoZz@hypds z+3*(Vo%+%|#|G>wU>{_{0t{Ov-a$m(xG%nON~SNHV^FnXw)6f|*F~xO1fHmA2)x?* zcTb(9`_8drN*DM82O!0cgo1Dxvimynkdz*aNzDzrwcR!`={jk<)WE-#th>&%{1_|M z1>gio90p217?2`+Ote*t@qSu>@oo<5ToT)JSdazVD0fU}m43&f9eR8?lFAS|i*_r~ zyKJuW<J;T4>?lM(iy5F~Q%B(OC5Pc1o%Uhr-?U@XN7ValTCNJ7^q>>d#sHU0-6Tuj zxn*b1q7*=?1;cT}dg6tX*2W%gKMKeQ_SWH852I8aSRA$9oYb)|7l%Ysm(I05b3i0c zb>K}u3d5sjW2T~)U88I%aBi299!=*~YlosGy45)k?EDl^Ll#fKdS`Wk#6XFOP!fnH z<FTaSrZI5Yyx$CoJSN^*-pEb*kXjB#J5WyPVNTUkw@ZEJ0fby52p6+jysMpC+5s9~ zN4?e_Y#JoSgzO!WgL?D|*UWts!p&kJ^F6YN#RBT8c(vYF%7A`h9LH{ZRYT9&%6{*M zhK@Bq|L-h|meDK0qzH1P(m<r%_6bVwR^m-Z!9B=mM$?SV5fF!5%vrht%N?{Qx)9y+ zrML;+tKWm+pehVdj^>wTB~<bB4jp-T_ilGW$aTiJ_HKR;!}PW@k`t&j7$dQ3X#oG6 z4Lw^3P}-{4rG9FATdf&}bWF4;<a*BQ#8Vl)3%s>uP<&7GE7B`oM#3s|8i19MBdmlg z0A5y?yo9nEkid||ylTEYm=_F-Tyocu#i`|9WP!HdG+hxqp92DUxbIX?2_C1Sf(Kc| zfpEdH8B^`iObW%#R}ub#Z%LR6H?EVS_f@)a`yd%@Y&aEQY=sW7QUW$u?WfRQ#YbCf zY(W@(Bnc#Zd?*<?+RuZB;<D9{VUBcsIFO1+l{%O%!8Nlk;^|`H-^0ez?;WU!5Ovo# zh)i^!d-o%06*YHwGRtOdyYada2RaV{feIr;RKYmMHrti0R4#oW1w-4Jm}byPWTCa> z?Lo!Zxt{~Q1=0vr>Ie)sAUvp#w0YwE8x`f6cMn!J7TctL{`R>AmD>Yj>bvU5I0uxR zK^`gq`4}j9@#QQDYKA^VuA=M=+L<wDDm^#yA7li&lb)IFgnubw(X;wPLHNICSNSKq zS+oC<9l;;$#%BLuhuo#}g1m?xviNDw;x@`)VN!k*u}=R*Dj`)p!<WiVoCb6zF}}5Z zpaXC@b1@)fkl=Z>yPYnA0Qx+VezKB^$?!A=#S@{Y7hLS~K2_+P9Ke#Z2oviB^Rod( zk!s~#ffcUCqwN7?%1KMazKoi;kw5L`m3p2iXMjmCpiK3O5I!pVTEt?ZN?9H;>mBqJ zDf?`A7#urxFrd9;3hlmfMC1-+vXQ6XU9WUiL|lD(=^lw!R*H?ND%$Oz&KgdmbN{*f zLUNoPPDMgia@<Ix`2V!@*b<f~I)tYHm;ez*A}isTU@3BXiy)L9AZcH^5L6jF3upl% z1j92&+u!iT0Xjn$*3(It4oEyP^-$zt&o-F*&_xK+j(~Kl(}(BMN&b+&R;)(2!;VTI zD91!bwJ;UO#=KrzG-WfsmMq6uS8VXSx+nfMH2ZhAtp4h9&$VF~ZJ#zPx{g#Q>~QB} zSJuTs3-rEjNU&fdK_Bp8;BWy5mF_BQ9m7Z%`KMF<#22ZWtRG;~=!MpfHm!%g*B$|` zkvR>yRv^tvbhpz}i$D;`oW)`7Kc+V<-T1zDAkzbKSTvI`q5a^@*yp`O;%xp4xz4T4 zj^9Dzd+c|Ns%_9lEEsDqrTc0Yqu4>PaPRYC7bVi4&PKy&a{?RcFyU-lx^ni6q)2Wb zgpnqqt1iTZh;T80CCK1J`UcQvi6N-So$^lnh%pAd_l%O?WWIU5*j3TiQ;vZ~lCXyM zB5X7Q%>b-nxZMap`7wQY&4tiPLYg&7MY;Nme*{_k%gP~R+tj~`0uW(W)s~7B{^3;D zD>7T*pyEoPtUeoIkLG5eD2SRt<v~>dhPiS%HriRkQ;7ZW+rnBB>816bKCmG{yDMn! zB#R#1kN=TAfB>b71#)^Lx++I7-Og%90t#{`(VB-nC@qf4K%AP95%Tzv3-s=xbOC9M z1_vABbL{^`kMiv}#^67FyG`VIyTmyW(uzpmW*BR4zW&wlY+D={q&4Kw<*CQ+_Fl3L zD$xPHBnyPEL2Q&@_^FJ5SgK*KO&dPb_ZQP>@|ju+X*OCk@ADe$Q5eNdeK25;PvPML zGiq^RN4`N01gOXb-F)(5$3L4NWkY0IK`9+?Y93GYm!C5245F1r)*r~ctk%`er9oO@ z*ttf_gt9>x!M0iTb+iG_eObK&<775BJla~7^2lec;gf=l1Bx27^F64R?XS4~V{v@1 zQ|cr*wl(*3DrbMAO2sh{=BUM;fqz#OvL4a!K(MChU>th~i2;CdJ`#(6C8_~ChxF9H zn+?TTZ*SrE#>I~PnEfV~dTwQ8(gP7<=I&O$<OqB$i}Mj}+YMWKrqXj|&uD-!RY$a6 zzXJ1MB*)@kc=9Ut^6!PMh4jXvg9#9i>h|N8&46zI(;p0_QRnAqh7ySO8~=$Rk`_jY z3D4(_O2s{uVhd~|CXal&%72gKi<T6!WkwGFissWxCcp=j0gz6{HqbuR1idjL(I~Un z|0!}2t;dn*SOiL0WZ{NHA<52m$(vV_>+nBYJTgQbR)P@jde60M&Uv1l*AsTa3TE3& zr^5;iU>MG{Ocgn3uQE<WRX{UHhUjyD+=xvy!Ja;FAJ7eXG61COYNJ?)#zJT>#L~&< zre`NQkuGTbIx_vMX+-h@WU|e)PyIWYXx-Rm+h6`Wy0gWib>ocqjxI9My8RzNllV7r za&_CV79A&ln&_WLBfq2a|JI|SchzU-m(~2ZY==qsb+V6`lUqB!-SI&XwKY5&|H5zL zT$J>U7w}?W%<!NSr6h4A3>0Zurl_CHNmM*@8paFGAiZc?+>P~8;Aq~836U=@4Qfox zYb+rm@flJ!r5}Y<iuebtQ?{hlzHl+^`=GvCb07YB<<w=mV*QrG+k|l+qyB`E%wO?p zaNE0jqcEk`1G)8(D_$m|G3cNH&K<J~kf|04M{@YGI+W3if=%nZa%3zur?Z?(RL|I) zhik!@JqxGb*A{%0Wfn2Rw8aE{G)wCFM#q~<S@g0w1a5~uZ1LOe@%UImBNJu&UWlKr zt26|6Dk;tWFEJ;IBj>gI6dXTNmNa^?L4~w7ohtI`O8Lmr3Gi;iI~$Um0wGBK2Da6m z(?}f5_Zpl1i<=mT+(fwNn9|AT(S7CJ`aZAV7XiDKE+$J?n2tjhYeFc$6u{VtEXQfg z@!#K=-g%~YW>e&U2wJw|^L5R3;LFN_q86K&H>vrW*>Cut*1q9l*x_3y^U%F9Crf<L zo*|n4X%rR&+IY#MIVxT@XY%51ydPDl4t0~0UeA?#+aqE)L?J0pBgS2ebp8@x#5Ri( zpo<+Q3m7h6mzOn_nd9A?l~9~#<oQ@^QwnzV!wRFPx8~QIhGMS*tFg9CDRZX(^|tU@ z*mG{$wBwIe@Mfl)8Julh=?$iz$c3KE^#-)IvHljaVUmhGyFsS4YP?7bO2`6tCREi| z)tcfyDK0KX!@av%Yb+ljTlP^x82i$VCk950SGsT(F4;~3FQwBSsARjQm0r8l^P+9( z_<P&se#yikA^XgS<<lp-hvzaD^i$DiqRhk*AR4TNM^JI8u<${fck+vrzAUlP@*^KP zIbMCfJkuDaJk#cW`*^;L|LCFmg1xOt`8s#TLFz%^Tg!I6xeG<#8w;J?1GFj$Kd~PB z54E(228*5xIf`aO`PeKoekTZoHB7Qi*jaTQTQbZQR`opYL*w>y6HV@`)LnN(ALBM7 zfEVPC2#$^x>7_wWh?k`&Dh8XxpHC1UxfxNGlzqxL@$GXCv2T<S&>G@-qmq9vV<U;p z{M=GAaC})1CH8_JRv#7*cG<g+AJzLTJV3V9SKXj?tO;$ECzvgvC%0or5cxcsYeU4E zrb;GD>VY4|zCCc2$)hiHID~(;Js!J@;@cD_2DmXYK5~g7b%3|`4=Iwd!=a{NBZX^s zSxZ(ueSY!i>P5>!CkyZ@+R{I_E@3ym|FQ=P5^vC4YhXTpcJ*?P7*3hC!K=lW_9hKi zvh~c?_bVmOp%O8~hA!@M$s#O3F^l|1w@C@v8d;6mrf7PIR(O=QG=%&Xa3M+7SVmQ} zLD^(;M|4bK_pf=1H_%oDzbq8Fa-<quDlq46GR`}+|KJ<^ODj|82NdwMrJ|pt0p0@w zj@{>(p@pOk)z!GZR+gU}9_}z3^si9d0#*BBbTpG?^FI|03Zs|ACho265^A|dO=8d( z_cG9~eCnrZ+R*N!fPgRUZhlFq6N9&@E9dqG&W1ZJfYWeia-S$!#O1m>Y)6`^tZ$vz z4KEAEL&c(O4RM!R$)qc;^x{nBzTZstY@Tep3Y<!x|1Q81oJhRkE}o0NsX<dxu)5#i zZL_VQ!Tq4n+e4^Dl(B{Su1&_UfWq>=I!8aC<cd~QEE7&20m-!MP2s+vQOFeREHkh8 zgc&rT=bv6Ax45WOTJw5R_}jF^sq0Y9iD%}-1S%7SvGoCf5A5YkJ8_2xWzVJ{W$yE* z^=1l$gda6q!p1%suU_o3*`{G}ymO*yz_Mx~8Yk5D^c#<8lYM&=gET0VWg}7K#{=qG zwIBHQ0lC}k`ZTkYrt5do^lznJ))IVXQc)UM%EQ#3@KMUz<l%~3d!OCc;)&JQJ}Vrz zUl}ai723HQG;~z;!T!6}FPymLpwd;h%C61Pj9I|L&PP~f@=svh$bgr^@06v9TI?9D zVSdv6>kC(X2@g+e*rlo+q55&NE_pe~H0fPu)gs@{IXT<|Y1o*Nw&(^t2o!SD<>2}N z!QdT7|Eyu9p@|!|2C@30m0N+2+^>(drG(Zkp7839>XFlb=ypgpX&P|)dhM=hMIR?g zWJ-maYxysyl270A27QZ;7d7twR%_!aTQF+3rHC<fX`&as=-E1ng<iSak+)v6#iY(L zm<-1%9;LQmr^|}c@Ju6PPT^D(QWUPx8F>=lqP=Bc?xht<16Z(p+R=G<{qm#1g3=}D z(JFk_=c~%OvreI6{o;>QABu&1^=@k!Qf{sctxkSqzDp@|<;77(>2hi!Jl^J*Qiz)_ zDJFyeVTOkN%el3Z*XYA55a=ke;L^E*K=^m+kVY+j8@(DQttv#8;4L!OF*nln!SRys zL&x$J!uVuw<^o*^6=td*E>r($$3=^xS<B0SYQ<6`l@AFtm0#_9CVjd3Maamr&$Sxb zhyTFfSTNVz-LI!NEz7WSI>r6~za<wOnlmiAQx<b|+oZrjVmz>R!q;!O*>NTYeS8T5 z1tk=qPy4FzBLH_>6f6|RSsa0iy--YGYn&wKlM2gE8d;<G$;XRF96>BjDYi#B#)97( z5t=-Y<0mt-@4?@LW1;Ng45z;MQP1KhSBH+TKjnk9fRY-wpZh0vwM&bu%Ev)>x4$&q zh(0kpvAkqoE0XH`qV7J&g{=JiiVvFW^@6GAnFi@z>GunO&gTqF@FOgc?!QMYCq$r2 zDo<RYr8!t3rBFGHDbyfRN2T>r0-v1h8f2bSRbhRDD32sJ=agwiv@!GBnM$CH)GiLf zx`g^xQ>NmO(B<80J)fR^nSOm;GGpu@-CeS1+o1NF;*YVLZ4Jo{-pgXMuUzz6#4hgK zNz-_AqyG?nSP#_RPYO^i6&z`y-pzR{YemRMyqn-GIzq6VhnMp@Wbo};cFt7@QMj0@ zo0%MGDrHOb67vZ(NM_^n?!}hPUe-NO`AkTIL125I%*$67_G9V$weyX1%T@!m)JEJh z9|pFSEfXj(V5@&jU^ujJiMeb0EkjY_=@r|3g;_t?IPhc*HDKx^gy-1-<wD}}xY%sZ z?nax|=_>XSt-SwCDjsp6>cxv1((<UByDT)g-CVt}D2L1IzYOJd_GBh8S8A4F5T-C0 z+v^uQzp37;)9LlOexoyraqD);C-L{ohQ$GG{<$O?)1AIgr)YoP&d`p@xQj_|=omTw ztL{37L}tZxci%w$U+av&yH3zvOaT%_k(<VhABi*((}~oZkq9|Lib$GnCkDxm(o0ph z!Da8DJiNHCvJh1tF%-vz@#ZWnF_#a+%|jP^de?95fmV`T6Kf7Nbr+6Z_X5m*u9%fF zJ%9DBYbvNDl;lQ#sqWY2mxY@<4?j*MR^L~=ApRw7E3e@Acld*PSsc&HH=qmwqU+UW zQbV*-G9`7T8uMiO+kVEHuop_o9^oz)`|5I}5#h<Q^7W)qb$2kY1PH2vJ5L)Bvp7Z< z{dj;NdsSh@Nb>mMJFADUn1*y4O5eBA{tOJIdBhZ*Kx;c&=7jT{qU_kM%scHhjiBS~ zhEu-SvP5&)%(MHuAu)C6odO}c*@6M>&aD!KtXlPMhR5AVw}a7YDqq5%8vV|)Qh^|% z88mzo)?q_ISfP*-aNA#QPo`0_@zN|oY%k7&QmWWB;4i;29KM@P((4j)JbBL0$J<zO z<IT&*n^HzTo5I30BFDRh1A5UNDy|bxxR4J#&d0(S8}c{@DV!HS3Iyb6yb}iN{2mLq zTa6p#;rR25a`_el8RY~Vce4>z<dK&7ael@>iSauR?~5aF(y*n0(t~L7VabrBgc)_F zBa_(AuHu*9?sW@4^wG<B6c}_Px>B~|{UggvqoM2{oZ42lO3xfmZrP&6gJvET$e`r6 z0<caB6b<yaFB2b3#uX47x><0jK6_A)Zzyt^oweZItGBN@IbJ|!<QY0;{GZ}Uuig7` zuQ_Wmb($d0FxAVSbRml8z0N_P+sTyG!BBtM^{zc@LgM<JD?u~M%{ztsu<_%kRPMs2 zp(*{p#V@d=t`{Zx#dA5LcAy$x4udjw^VH|ox{?_JN*&o_vkA7#kG^2B3@^8<ew}x} zqw}*;fe!A3&t=<sPWj;WeV#8@5c_+3pra}mj^}o*2dd0L{Z>uafN-=CIqfTmcEqMk zQlh#m=E-p5o@-xCCqC9-(e}wNj-lq)Qnw|V>>0Hyd=I<KmnFuZJior09rLNA|5+aX z{>&%hbvv3Ex)*n@^+ib>rv#lItRkP+o{z8z)t5jrMD809;K(M#51b;~X~h<8UsYRE zU0=5a9-l)@Q5fHOV0@<tulOAe-gk@vmgX0>-IS*jn!>QvD|WyiNhcC!_!<1QgSRL& zx3qkGx>cmPYhD4vtz;ga8>m)Z;7s}C^@J`Br$d9&H(hD7myfiWe!kw4|FTl})7!x8 ze$Dv!NWR;*&5!05ji7-bkzax(PntR5v`P27l@pfL*Grw2c+d)i!Ya|QJ1dDqwdh4m zH5Ww!GC6(1m!wzq@T}M?dgqAZp0!F=Ro7lnBxf>e<g9>3vst)4NLV=KU63x!>LM)T z3u8(X&MW$qYnP_lX09RP*gWn0V(zQkQ!SaN(PDJJG7c<nw7OljEP9N?SQ8U+88@?S znN{<B3$c+km3iXF+IN?m#486y+rBtb5^dp;j;S{#OA_}gZueZ<+2mUKeZUSnBJwNa zV{1iw1yB_Nu37m&k<>eeQVyOI5&irDh4Hf*in<z4%<2K~Jqmdi`EDx32s}RM5i8r$ zrJh5?m>-T&hzF2D?}@L}Pn8=zCo~A+HqCo7()(s=BzWQ-%LY}V)L>DYa##3^InDcH z+P5A)QD4*E7Re{LSyc31del?I(KchZXm~S7xB*o^0@fV0;opOPJ3s!N<;DkF0@#-p zq%6l1k<%GQLX(C)8)2H?vw}achH$CV7MN19Nq)RRWdxH@;uWY^+>Sn-2NUn^yg`<L z<}6R&IEgTp&HFqjx!=OSA#&sScy^xG(MYu5xBD4d25xV3n{|zzUkhog*|SySR&>ys zI?VNrmF*q=8rU4_l3yThJ^aH#fUZ=Z$9O1-uljSsvm=D@(C?}NVeUV_7<u*^2dAfW zrh71a<qjw)$C>bYSq&|r&sfPC&2S$U@39vxpJ}tEUXoK8H{4(1M&t!I56`OiqZQ%U z=4~N3<`-(L=ixC={FsQ-on?z;C~do8lj-z2vo6DU7nU{Cut!7lEhrNsbdl^iX|Vp? z#cS{ZZ;*wB1qc|wRRUoSkC7Pct1ak}7Zdre$-ISmy_1OHH*ePkM3i8D=h|9`CLXuL zCcO5Mg;n6PRLDW<;_DKEg=o@UCMj#0IDxUTxlCqOX_}ztxWXNk^X;_P4?YWIirs#^ z7DD%L)%inf1-fDPMNDA)O*62g8axJ%w}<ek<%+&f_b!tRZD0|<rI_~-!<ZC~L{{fq ze>(HP`~x{%tvla8lh|&o^f<>D(EAClOonDI&bNnp|H6}DB2mx_z>X{|Wic4U;teTw z%2MB^Q239wLMvAV{&`~$fj|I?{b4f<Utf_JyulvAetZFaAJA92n5lb?ghuXj`K3)c zSS0sEI0$v+E-qlv=YvH3k9VZHMuexowSgiM(js#O_)|J&jAKhbpX}`?<mME{F3xoo z=?nXzCH_yFh%E^+6?d^MC3$r)RZ2K>Gn0l7`)-z5OJKs{<hKOE3zhfWSm?2k`w!;K zneW8G#y)dJWRlD!$IzvGwaGu@2D7$N+5p>8y1?x2B5)(}{K1-}QsH%js&{Hw(=}Di zdafU0f9|i7<X$;_q$P1_b|=dV55RhhhV6+r(LjQ!UEJYSdDI+ntUJW!Gv1)jQ#|2T zy8c4{`TeY4gOOrtK6l*khbFYMunw{M{D;SaB<{msedty>8gZ&+KSJ6N7*J6=3Uk)> zZQ+%Tgx2h4$tVaE1bwp*i7t<3nDN1KG(DRWqfmSn?8rP^`j#jQa>58d9hZmSoIlvq z-!XVsr`(zd^^c@7w5fnHMOK~8W6T9<9DRmUGKC?Ix_*k7In(^oB$->)etC1<E}*SP z;z^>=(|ZP&9}RdWa1O~x6p1q4E2&vwT*A(iGoo+MZ#5Kt^HWBq{AOP7w(Uc7(RNxm z=ECVq@JnL#>80(%!1e~5Fff5pQ1Z{S66!prF&Hs$B<U4gb@3xhaz(~?u(H;M1zq7? zj}s<Jtg@@1G752(f{~9B2ERt&aA6J$vpw-;fQb6bgq+BG9oiIh({g!I(2U++F1Gtz zd!dq6o$gYYcG$m<W581uv1KRpc7-UDz56lwsty<MV%AC$RNlWnbDn~~#km!orXAoF z!z4?EQF=b_x`0$dbBCTo$MzlOSGGGIp`tNLdKokk!I>%-q=rFZTJPfUcPxyrJb&CV zl(pmBntkPVpN`J^uBw0u%hJb}*_r!c)z2U;vUdN;Ut=ghcNZVp_38qGa2uy?z-&08 z5(`t#6IG7zzvLkdMv#N9T;NU8#uNo!kHvn?n1K=Bm?Hf~Ujz{4mUB@OF-s1i*oKA= z-?7PAgCzD@FNr5wD*I7IMpyG`@*ZyQ@^>wXbJN)In)S*)rwCDu#-csQxI@#e7*%XF z_dmrHIt>tFlhS|JeD{lb67*HwG1ztN-5w*>Stwlx{}D&16VF&2TsbzDiyW>J>lRd! z&j}qUc+1OqTjXDkip$}1Yg^xeHAPgA?zLmCh+s<cB+*8YAc#}n?29T{a<4lY&JvYP zuuo>!oR}5&>-D^gzc%?;cvv&Q;P#s(CK4_F&@1Ln2fA;zJ}k9x66#ZxTuHKroP`Yt zaaw!oNpQK*A{-wSrjXhO+y%0DRyB}i!(M^BUnqHcgT{D1)bDaCm`)JJn74<fxnfHK zzNwfa+4ZwR9otlsDkHXo6G1X?*BenJ1M!y_{@HyuzlcvjXlKA`Z|4}tVBo#JflV>5 zx}}9BtrWY>f7s(Xxtr-124^aZp7rOHLj^PB&+Qpz7#1FmEY{E<gFzIYmr1E$?MR0y zNzZM-W76Ow)75SAhW6y-Sf!qp+^UoCSW}5mEhS{(uwS`j0R%p3AvB54B{cQf7m_+& z9NjM?WGAAaX$v~mqS`JW{7Gx2;5fnjpP~dD2;$ZY&Y1f6S+=#TN(BXvIT(NJXfA#y zvVGn**d>gKud=9p%tQC0X^n!1q`RJzh8hAd=jGu!<iU(2+3FMBz#1jUJ2h|rHtw~? zz6YYg%Z<1)9a2tY-e8nfsyui2=yR6WR5`T-lP_Jb!uZKEjy}~#pV~+$qTVo2znnG= z&}}>BTE1+`FZ@(9)C1kDp2+!okrBBhMBD_*FNIX(^US}j1`-scPzY9&h>R$wG$1r@ zbtLI(v8C@DCy~(1X{b(S78XgiOZ%1|76=+eV9)N48$9Yo4D~9cCAS8A!BCLX<Ts#} z2^+bsWcKlEM8<!p5RxI}R`NoAJ6}6vQ6b9wJ468l0XkOF-c57ww&*yRu7_pS5=D8% z+e@$~buSw&jE5W7^x`cht^{Fyktv?nZvTX1lq5;b1j5WtYR*I4c(xhzE%&58;YVdk zW$6HAwyAO}yzNVIz=b>R7g#%*Lv&6K95PQrZ^QXzY#dn*ZJwtBXM1O3r~9W89!N|` z4c#U&lb=1=s0Aqt_~zg~WPU#oClsGTN;&Js_AZr_$Yk5>5cm^#O$1_Id_6dbDlz;A z_VFphKGUJRQcI3`O_fx8JJY3AU0#fLU7wYz&ik<!O1&YOt@|ogIo~(b**AROa19l0 zfP87Sm**ugfJjkiC2*y(<))a`O`e*L;yzB?hggw4oXYP-_$_M!;;<qo_9Fcwu#SP> zcYbOa6E8>@OA@AZ@?Ot$%H&9EJI{?qyXWGYE$x)cnk=twQ>=69>n(d`#r}#3`B7MZ z+E3#pKCx-Z7J_B?`&lChbdp+!YIAalBhKvaNA7cPA6p1a-*YL4g4eK5NFtm|d!g2t zupf%Bwm7M!y{vJhH@W-Xy?NTSdHP-#4kGUddworMh-lWGEk5gkq3XB3`B$!b;|E`F z76@Pe_OQs4MDj<pRQA~Jp5@ztyIG%9Rs7r~l~DFKRy^H5W!$)LG&^zyWPAtxTV=@e z3x=Leqq?L;MjpB-DtDV&+Ipxl^$JV*lpjvopj|RN(rEa~5tAiXT#yWoe>*`7Q_@Gw zsuWv8mW`P)OViV_PbNpdf|=%m9_-I*5HDnA{!j{_d!qK>`Iu&z(J!+sryCDz*aX;- zPc)E2?Bx*5DPxych6gx8kxcn{W)&3vQiVNyNp4W_VDD&|TjA>b&6xH1(B$%ouD(0D zxk6cT#>t^V>apUWo?Awy7bCNtk&Q{c419kvhVk&8t_$(ksYi`4_tHkk|B&hM9f<B_ zwW;dS^O-S9ZCajFJ7Ck$&>+=2Yeb1VbQrKVDp$+uRd11`MJw@0q|iwERtb24E+kJf zAh0yD*vL~<39~Z8hB?Uw@;-v<vJQ?58(Q4=PWs-^n{7d++3zUhhKEet%k&Dp0%y=% zc*-xcnr2Ju+Z$osAl^rr!iE=_9U1YscgFP9mQv4zzl1`GL*DhvD*cYaKa5?kxU`yP zC@Uz!1E2adm0!f>x&t<S-}&O9Zf@yQ=W@%hlT2E;6{3dPisvKL>w>fK-Rmq^7muNv zu~dqRCD;ppmNn5(@%|(^6S){Gufl;FJsyX1tf{})754-bA&qyHKLNi+r6x0+N6$x0 z9P@zQPnQ=2<nrEOK_7V6KsFaPGrkt7rJbEsF`ufH>T74nQ#*mP{v-obhq!~$G8uL^ zJPosEBkWNuL1r&4Vyi_bz!00*CV+!uqZ2E{EG|UnaZeAPNjK<vIp`&IY)T4-QudPs ziUI7BNM08xc1yr+cy3jF(&F-uhWrv2<aWpkf?m35XkUF`_c`+3*xkX3XK!XZe}bD0 zHJ?ou_LMcidCXdUbPkfn9j!PqhrwTC)*cIOcUTbI9#+IIX9VY&w*=zYnZNWU$ShJx zdQr%rBlvc<vj%5ekQI{n>cd$9!3iFYC(Q9B1WE*_$ZrJWiG}f~RLTB3Ric~{OV<3x z1LoJ$@gJc#TLVbCPFU?#M=&KE!F69F=ysAKa*4=UgFDvDUpR`6X@%_V?Gq>jY}>@N z70P3qU39A%#Q3IpZ^u3z=JmmW3n=PAcwroSa%m@ti5eR{pw~q-2x_2G`?dHniig7j zv#+));=`30(tzQQn3GlzLqo$2D=;Z2K71+p7wenIZduQ$pCnXJ7B<AN$&)ua^TKJ1 zi)ml-)m+cqm<^+Nh2*CvU0vD{Q1K*#mH!{MzB``E|NZ|y)-evp-s6yrvR5*XO(il4 z*_)8c$~^X7X)1M)RaUaHkC9mj**YX-9xE&S?nCe1@5kr+>mNO+<9=PQYd){%b=_m? zjn(<o%xb`fdI{4D;+yP{bbUxaT8!0#TKsR32~z^IT$+}df={@2EUu_Ys9wU$Uw>-Q zauOH}#9vSC0tC$U!DghDfr{|+u!U=5Zv@>gft&lC<6RRfqYz=FVY!}ERh4FAtZWei zt_vD7jdKQR&g$L`Iy4$}h`9E9G=V@&=FgFt+h1j6Y88deMK@?(L}~aGg-sK#uRmxZ z7V4aX9{I^y73YuNwdKe&6NyWgJ@(UCo&aXB2bIsr2o$p%kQA2o_b(A!&Wov5TNvB- zUv2tQqgnQXwwrx%T9c3}Gty9ep++-~UBS#jH=Or@_B93x&I2uXag;Op9=mR|qU%n( zSHqO&Hh?`pR787!X+^I>sVPL2V&JV9`}%L_Z;W!R7*Um)_0(;U=G*(-Y5lV`Px`F~ zq{^P*t<H0{AV+H|F=q8dAgmlgTwuO-1*loNta0se7M75bME7aM3;Uqeq{p!7qvGsq z7s&O2g|W2uUP~0)z#u^YRfer+xwwN^|1j^kdLQpS8#8(}O;fgA)<jVIOrAbtsm|nQ zL|tVBEHVLtx;k_lQA(SAtL3Yv&!0awVW|3h2_HK-THD&%W527IjUeZ?$+E2%Ao^y` z=en&siWY7C4vxM%!;<h2LKHhNWO_Y!AFGiK>H^F`tOghA2bhsUOkt3V90Y@}2!+FB z{TIJD%bxu6lXQ=e2$?4l3MLvd5rUnU(^g3Pbl}<XoPScmtN*5g9EbRm!w_fAeolGB zta`2Q@L(r7^Y%xBs8`A%sjqw6J||=foJpTa<I}|82+`ncLE;Tq(*2zz*_G8Y+TiH7 zl4E>54o?TKe?*)S)U3R?QT71V;Nb&ftK?$Vy)Q*nx<rS}qi$lPLs*#tHvvGd0;n`W z^=*?O?wO$Tn5iG|dj%0(2?pz9GXfeLNR*4kBbaxFB(ulVeKFRr_-sFn8)~aouf?PU z{td2K;)&owt<poM6LzVi0^qMCmgPJHy=YqhEhYe<Y&VlDkb`5vUdG^R2w-ssWO&$Z zN#*@<3upe<EyM!lSTxUt&>6d8#*(Rzo<|$H54KP~p$Q`X%*4BZbMprtQM_YgQqb0< z1mvdNzbrF=N$`F8XN(*(ou&7V??kOB2UB&+66r34U*)w1*5sU`MTG#1XMkMj$x#nW z4at%5G}aVQzv>UnPoF)*-0AM76c5?jj{qMEN2n5P8I_dI9`)s8Z1%9_32p>lI!EN% zoV9q(t_?lRMa<uV!W(b~8EX(C((vL|;1NZ(L(AVoBb5Qy0nnE+fXB{HEY8dMh%PCL z^Y#Fw7z5T9g`@29M3Y4P{-oxiz<)gf7$L!KzGVNPJhQfTU5u%1-zQK&D~<~h@74jK znjv1BGBaLU#@lB?CeJ&i3M7_y9-qyX8*(1t`@C-Db1B9^bw)MY^6=-a+KJV&*qs7b zvrp+nN4V`?*DT*Yu~&NhGf*4H7I?K|_KHf~)q|xVYnQNfG=Kb${qL->J);SyaIQ}w zF#4F-_wA)XWvwHC%wt}lCm8%5Bo~RyV;@;D3C7&H<aqpJc2hlve!;F^kficu%m%Tt zs<q;0)9MEUdtL9<)FYb*q30x|76b!)bP}#Lo?l;mI&tPHfr`5N78f(BX_HBmho?)B z=Kdf5R|0|=VCL*{*OPOHggiPVtZlfuQ0K~XH`jM=jM?Ul#PQBjyJBI}oU`hVskgFx zZDoH4TMslx3A4>rNgC;g5|r;=WNo#wFnv6Ec9eaRG*s_r@@;wP`=LyJT52Rdj`n3H z44iozU8|mtgG<g#UVp#E!pdGVWiXtH=8)!vEz*)Sj1OSLj+dRW_bU`k0KnmAt;@XT z<E5hKPbdLnm0_q6OWW?ZFP`&$%(Xf9T6Xfl$xQIsv1_q03a2is-Z=m?8d{`L3N-v- zH8{O2bLZFHDE?kc+M<_FqS@-~7`&YJ1WeHWw*PPen2BElEP{8UzIF+baC&qVJE)MP z%@^D6ZqCCs9PQ6WNxc3@Br$T6H8eRY?a3n|I}qq230C41<Fwd1i6Ll4;1Rf@wE*_= z^Yv^Sxs#}40C+9p)liM5&Trd8YHESVd_|a<QP160;8T(VH4_6TO)w|%i5Z`o->D7~ z6yiM)x<3*Q{)n0k!~>YK!W9L{i|;-05L+JcP2g3$*lB|ePz38k1QeB|>Mqm`SZyLH z@flCl*;`e~AKOlpUmK#&Vv@qxMveU`#(L+}T@YI5fxhCJ*dW*z)6@K(@EIrvY&Ct) z`eEp$nHrMuF7+RX;SWTc0{LqZe^P~1#9(h^R_FI`jmKg==H-uh6%q0rMY@{V&h+|3 zUed<QGtGhdj4|ggEZfT7Ti<tneQLDy*7o*9uVe}382wMP(I|3eJjfiyv%9}C?p#L+ zpe#bg>)*y<x{N|v_d-tp(SM(&8S)R{if^NwaJepq#yp{>NJW0OcK=ECfNtcrO9sWr z>+)Zm;A;WHG?G$A3OoD=Fp>71$3rbL0}VlHIEXBQJbZv*w6`+NC79!7<LmWcD!?;S z=<Wx{*tDubi=1GojU%CD5|r;2|7#M26e$E~ygFXHCB=+Q3uYc2W^%ciP~c(vMt%j~ zVF!+)W86-Z?vy44wjFK*i4MpY7!h5~ca)^p&Enk4!suR?QVT5;Jku!cARudWX>mu` zX3hrf*Up_^tF~K*JjIak{yGy_U=vud^6LFt!fzn8O+9>Q1XXfQB(C}UIpJ?ydAR}9 z)F_LxCrnimhMqW5>ZZBTX2wz`kNpQjnlJR;t!_VBI(?q-Kcu=pmjyxdihi<oa#6n~ zCT#v8a=Q0hqj~|cuKqB6j+l0Ae1hgD0rWXw<yWU(B04>FscOXugntj6c@s~fE3cUJ zpkuzMj-9oW6I)`_iFTk#vhg~UNwliuC&6kJPKqjS1Tv2F(>dh*_y2Xfe-+7(@GpE} z%aS;Qck1DY+x&5=3tN%5VEmsg`OFlZnHCqC<^<3TeZ$x7VyJ%Eo7DKox5@n8KYX4U zuxK0gd2FKp%=Z&OM2&XASwQlNvxuYf!plzF#&&JLHap&mU}k_Em|zZ(Wz$F{U}lEK zqax>{W}2a{5%pzZus|CK`~s67VVgBU@h?UY1}}qcTcBln$5nn*{$HgRK$HJ(B;*9- z2*xpEPnQt{y0D#I^Df-+aY)u+JSl}3ujYQDW~TsJFb2M3BO9_u(o%7AN3e3P`O$M& zd#^bOSN5qx06hVU@7&m}yDa3c{!PQXe=N+JsML@Pd<~Hzt8xoHKIwlA#h@T&k&4dT zMEM!qBIjTq(F(Ac@T)e=q<~q1cy{fB%-1%}3!Uu$$9IHHL;q9ZaZ`Xap6GSup4eAN z>fh>>4DU5{DQv|?iA))5F^=>!;SM|_zuC!2=HJvkxgued#N8{(HF0O}!_Mv^fnN(x zge!A!pvIELo9^xF&P6MBXR2-`OhiEsJ#Ici>~?B)59NAJ5CRT^ZiCXVk}mDY(E*kk zMQeQh5ZuzsA0pSsR+B}FOR<PW*dW{0hdqpPFFtp1ei)WC^-4{!W3mQ~257QM-2%~z zzxWXqAQyxg=!{#&?j7uKwRBO|##~>Uw`oTg3n{a5WTQlox~56o=SITMU7xHwNSSVW z_dc8E!imTF0vN6Ne*Gb?eK{^sbN0ml=@ayk-9%e_Kao-<B{EMK#i)iV9wQKr09B_A z4?@=nhcR3H{;R70x}3-VW`QS-FbEZP)w;8(qeI&VCuG$aKD}~~tX{ytIO{|T_hd_q zyN0|$&9Z<&X9-+pIPWBE){Z-D@9if&RZN$r-tHE$ocaV6tDEjpJSS=#PTLxJKT)#> ze9{&eyL?dUiJp%vo8fe*!CqGO2dEa4@*f2`In5uR$?;b&@fa64@EJKBA0YT#r*xD! z{?3r&jw$0OlC)2G*8(9Q2(u9aYVF5AFwNFKI6s2`pt%5NxnkkChzIlSSGV0)qJ@## zA9=qR{WyQYwZkc$X$s!7_7j0#EBuxR2dvVZ1dHIv*Iv?5GAa?|$QRSlBYOOuU87F@ zFPOmy`j%FN$T@YNKDR0FnCYE0W%YvXdsR+g_RpRebxjNbJp6_HnZat^Qb`CqK00Je z>^QNv6sTKaA<TVf6n0f6H#_y>$t`+WZw=znyeMUqFv_IPpH26W-0XLs$z!GTtbZZ_ zOb1<}SYz`C($Iv^{*}ldm&ZuWFstHI`up%8*=Do21-vHOStspe3Rb*NL!%MGaiL&a z%a&ike?QEoH?!Z6>*S+b2vLm64;|aZtL4p-J}#W9Q0SkZUbJ3cEP_3ASOL*p6&=fT zZb@!?DdQ6-iT}^EsOaZum`|86oAp7*sMUP}lJka#{V}KAt*~przcF-qvIMkBdMJ+R z#Ssfh_$MA_sTfic>D}yIQD$MsG>x~%D48^k1etgj3~v}F1mo`OadnD=O+a8KEbN<} z|FTCw={U15`)%<Fa#X-iBLm&v$`vL>LnR_p{VqlwVmQ`j-}Q)03(>b475TZFXBjq4 zFSSx8oC6eokm?jK6*zKV{A&E*wU>^i$ho;L9o5CB;~%(cErZJ3`0KVt%Q|<$N63?J zR+7H$8%fe<qvP6~{DD)TRh`E+1SWlsz9a+S0;(5VoF!U1fZw4l>*|w7DIdcvUsuH4 zNFSnoR;%b<$;T-OuH?|ETdy)cU!V&&e<z^d;ea~?JK~8ke+k9pVMt~uZjC0)KPrmk ziF0QTy1>^H{vs&SGP5G5$oVZdX*z6-H6S8JTd^0>y!-j`8CC+0gri1{el;pMeEr~F z)(kl=_qm<vEs?KR9J@=#zP@2t+_^FlEI@qJCv8<Y6ymTc`||Vb>aRiZ=gcN3T5MJj zqD&0M72(4DjVY6yCWQ*75KgM9>7}Peb|J1<rvs%%X0Wz--$P68A$6DAYPFxL`*&GB zQR<&}R-vjy0IuXZNcSkn6bLNp_e(#Rqy&Nqm6r&ew3FN!<et>c+`9P-vPljA56Mdw znrxzdx_3u}v#+(IAOJG#WNQG3xJ?v+L<-O!`&J=h+7Nz(n(=M<8X%L3M^p6UGNm7x z%sU}}E?cph?B_gdHqhJ->WrS`d1yGM%Vgpx03<Myy`0y{whY)$E&RRRB1*=W-SEko z@D=hc{JV-)?)$xN-}ff_FfJTj`8jM9<N#61wechOIy(FU2T{IQ+${4AvaOnn)vB1$ zuh5APY_!_HX~%W0lYt!fI4y!<?+9FQ5h5oB06M-o)^-Q}?sJ!x6!d}Yau#oGB&~-Z zDatQbtmK1z90iw2m3AushjEdE^8HIgmqr;M06@r9brH}v;9*4!1;(1WeSO|4<+XZI z`2&U@*x7~I+umN&C^ju9zmwpF`h1Nmy<=aO&{5pmhcBw?Z^<h)?(EP80zxZ~`6B~Y zf9OfP=rORkaW5lU&=`Bee==zc3ci%M@^(GO_5=B=Ya$GLPqa0lyX)v9RwCPkNm|c` zm+6(n4%BFsN^g>tyJOiSAyNv|(U8F7hY^tF>jaccBf_NebR2s09TsXJK5pvb?;(4o z=dMYCaiggect%my;C#79$?O4{x~OdM?HM!xcFD`|`owBqeyyHx$qqFb=3-(d{u~gb z3+gjBt*@ykiu8Y_$+|d}C5Qvo0F?~%yUC)8^Xlr<8Hg-`AWDbUJW)R)m9t^k;|uaJ z4Jun}JEUBIUM<7#po>)PX@yk>B}qfk;^;Up_s?_JG9?G#1O2vwEx}I$%vD&Kot+UL zW}y}LJw3adfvQBznMWg$5IJweFP_kNCaxFtNN(^|oO+wo7=P}tkI<4%C@Z(~Q^f6e zpl|j@bJ5;-KG`dJSGm9O{j+^w(9oGrLMGc_CR(NBOy;vPaO^2(pp)toI@SHgwOM`@ zN<Q$x03IH_KPRjQ>t5!M>%Lm*6NwdRBZ<Wrj?(uv5W@?aLYnU}v#S2-F<tleGh>M| zd8Usq*LYo2Q%>8Q4FU;D&ot}jLLOK$h+JrM#44^_9|*fZz}Up^9i9{!zdg?O<?YI6 zlEarF#lew$B-OGRyl89Gz5CvnitETVl!AiwC@+DsCV~Q(#Q;q0K5{wIByTi3)Ck^O z(Pzf27CPnl6BXTPxPEOm?kB0-E8h9%6%e3lN8q&>3+4HnuL|HzAzvhwpM7$d<J_k< zdPM*E%fs};>5fTaApc>5=$o9r%+i)@)_A9Dz7PP{vwXsJ{u46jpR&0~mX<wuau!LK zApeWw%q4fDQhq{y=z()-a+nI)?*02<!x<?Lt-3Z_2ZBH1?26v0n3hi05p}5r`uJz@ zUnvQm{5M+XLq-JQ=-AeOg3BO)?&RoO{raHL<W01bTmFTXwznr~^l9#i;6PoylR`~L zFo1xWr69QZuA~{prC=7knf^)fz_ji!a*szSL3YFdhpN$~!FFdCGPB97qIUPYagWiN z1zG|rV(DfxoOQZ3Xe!6!Z_Az+vv+F0aqj{~jGLz4uZ>Vx-r%s}*X1#F=vGOXXy9x# zr?6PRHgTz_Ii$gNA$g0xa6Zw2mgGUJp?i(?ckKjmMOno~x3AAEH=gWhy}kIOwgnvq zZy)#o%>&h?G3hH5uo#^Sa4&W<gddR=!2z6=n=Ci1;Q}dfL&-Ne5iG(OoB5U`n$H9j zJ2lPye>htBGmv1<NZC{OQ%Fe}sga&lFR$LVEh^duwn=r1D%90zHLlUBKiAeMzx=y7 zgS@K{v#;!VZ~f(x#;Rg_ODmLzec)EQQNql)n)u5R(aGWR#RuB0n-!ZuR$o6`=DyGA zxsl}N8;!m3+h)PvfPC-8Q%xP$p^ah5pr4A`X75;YVNu!IXPiZ4?lzd8eXi54MC&XV zx_E_$hbJq)VSO0twlxDhj5*S)9Zw6++g^Xnl>fqEhLA=v%Zwr4HJJTr^u;aB{)etQ zDDRKkNtib2`S;XM4oq@_eUuqD;k~gR)Yri&z;d-~ozhPmdmFsX*XUchmg3C}M~)&E zdSg0Hh5`O)A0c6Q>PwQ{n2@`G^Nrto-4{p~iG+(iD=u&uU?^*vzqdZ?2I~k*$7;_# zzLxf0D*=f$Fg*qdG*blM?{{AaWqVB`w}_n-<l8s1x0041&xb3p3kzEA0%k&`4#V6y z@d7mth2UQgrVo-|Wec8y=%;1AJt4TPWl(7wGB|bmESL@=^nfMO;gV(`sqx{O>upS_ z^H60!*=xL>Lj0O($~$N!Xms|Pb^B(|_ON?xBIDIm=pMCSwPLp*RUtvOr8QKJ#Y}iQ zy63i+dMpLMc{V(tk9;HruQBi|wb0cn_%_j8R<Ov~r^?YGczyPjJ+bL;o`@OIKGpLk z_a(-x@B}O(;BUdmn&AMZ&|of(>HPR`*?PoxR;s1fs*&u?d$F$$DUa#dXfcPgqnD#{ zZuyF_%iT%JKd;b1j5dBMzrzK!>x=uYugnyM6xAZ3@{utMxI<43yt#B2#`=aFcELj# zEs$Tia<Pk=Zid)$SMnhyBOqBT4WEzyV{-W<`9X_>&M0`fe1MnOZ7=~(B}1kugj!xT zQnr0DMyGvRSP&xPIgsuYeZ0JiC89t@B9d83iS&7?g8w4zQ%>R$h;t^PP;q|Hey={E z2i4>3ZN?11Ig>!Tc#JT|N}nxiY}f|_2<V|0?}d3fs*+YW5?wlzO(Bmj5_12i2vGns zB#=67H6Xt(YfyuzhH@X>;J?Y)vZ!0jay6q-b3>Z(VHj9Ei1%1EkhwKh#S5#Uo)CtE zlpc#oF>-yC>P9v-yI!F<)gNH>g7wPD&Qy4<w(~js6l(g%eW67F%Ia&krU_dX3h)qA zf*(*bT$d@8_yz-{$1rCg@poho=_B$_sTx4b3Iq3>Y0K}E4}LanbmubWyBRG9=*or9 z#4*NCMM(fT<NZq_3!sd$1ui}!F2_O!LoyvhVyJ;ff@lq6L|yQBFiwy?`$y+VAq2i4 z5OgYk3ql28#f{%rdii^vD9fs1;3fSGkd*;4<7Uv5iy*m9@`_by`gBwOd%{&leLK4! zA1z=@l`D4IF*pa(ZEqIO3yDV7?zz1P9-$`O+zK>K726YeOD%Z1Wu>3)H0M9PY9u$3 zi=Al2oQQJ9@K&k+X$hh!13u!Qf=(2~tQgf*+<)*6e<f3ZR4i3G629TXUd~T~>dGF` z7ZsZd!nMZK$2keK4k5$)2jWOB02Swv{GxsLFoZII*>7M`-doQ?!9VMy+9UgWNL$v# zzH4G%AZH&f|D?DPYv5$(AuFJ^2SPNk=RTbF9Re;K^zoc2kcGI!(fDCW`$xWF<{yHc zaI$U@kelaTPYy5@Q~pFA93LyU9BM@{$^I=z@G6WYoG>?ME*orEVk*DodQv^!g$Oe$ zh4K-fmOD(Sjoq!{bGWduOo>z~IS3vGtezw^BNa0M1d2hJlGEUhG&SHg*(QKi1TqT2 zJvTp$`@*7sT0A0bSb&fq_ej0WuB*B1$DF&2|HQ9<wG||%Q-LJssOgIoB%v6aYH}u| z3X*40jDa+)C6hGW4xvv<ON&G!klLxUx60BRRV&AL`WZgC-IN@-%^ZlFHtxzvzFcZj zY*|xm`PTo&9PfvlCCX*fe(8KlyRP-4ru?iU_A+{GeY>JLN`aT1{1h_o1>7A!#E1+( zhx&qHT{W98$AGJB#()c;H~jjIzW=iyFnw)6BFXHlyUg7W=Ts;!Qv%M;YN>nN16&)c zh0K0_pNndnZr2;yDYp3EcvOZxQ>2odEz<%=lJ+d01gul<C<Q{8_I(Ct*2v>PvXZ3v zhdWQua{6|cRj%LFCzf1@nH-$Cp2g$=lLCbOOv+u)t69v$qLN=V!pJVbnb0}KL=CH9 zv_M>AczZA9DD}mVA9D!LQ>^w+buX7f-J(>0Tmef`d{5_^SQ(^3F9^_$NxF)_-)<eS zkWSPWOBU`hEPWO*()1o?Lis*`x9eQiH>b?y*a+u96$hrj^Q3GUzWq(pUmwN_Ty6;u z3T1Gnf_i0<JEwj;@o%L6LUMl&rf>Mb4*O%8?>y;etA<Y8$^krVQQ<{l6NL~7g>2vk zftvTYQPhpw`Lz@goY>h9=V2^o-LZ5;nvfuXLQ>M0q&Iq_Il6n;gD&$_)&8K!fO3=c z9qkp4F?8tqbi?Ky{4r5%eKR!_eL+7@-6tGLL5S3<acYf*)us_5<vUg6E2Fz#pS^3I zNH77E_t~s3y2B_Z-!q5NUS__;$|qJhUh`_Ydw4B7Q_~K4#q#{8Bn|@?W+RcXt2bB_ z_wcX)H|%e+1R{=&*Tf!#g7I~<LD_$iM@1T~W2eQIrb5@eRJm&R^n>$cN`u4<=n!F% z74<M<Vjb9HzU*+(EkLBw5!OAt@>*chywRI0(1M6d^gcx*39WgxTn+9Y^a0d+;&NiN zAs4cp$&doITG!y`-RxY5zbgVv_wa4J+ajO(pe>Bf%OQEGjdz{&Fbg34wa}-eY}Zk- z5uoEX_B=Outcf6;y;N}&q&lLU<tL9<;Odu(n=nz!dctAfY-=pg&;}`ulvi7SP1`XO zts3<p>ZqSs3jbjm|HJi_68kd1JAMG-jy(CA78)-@Up;ZsCt6?B4PbT@HB}}xSG~Bq zw{$`6*0Dm=*Eh@klWtysgux8#?iX4Z{FMU#xI|wTS>Fuwo?Qm_>^+hwIOt~sk2bui ztN%-`Yhgk8IEOQy*Iyzv87Y7>X)$@?8>~E-V#4-<nwGoe-xNU==p#YLdi8~&rhU3V zN4Rlj!Q}9zOT5cn0;(d6XTn>s1wqZggw~nMth07_4dL_<DO4g6_6LO7nY$=_kseTs zR|AUP>j=+Jc&$b8{?AE;tQ{O|`iu+_-3J%el<aqRe^RJ;KYSseqFd_Tn`-kO^ijcw zN0bd^*$q;Om_g(%Pgz%HLNyETI7TH@)AqR9?P)x>lqB>#-hBlFM$q@~--R8v_4M>K zVLnqizAqD#EPel8rR^DZ22J-+Ru(aXUdpbPr3putT9BY`=A=NQ5pJ6F(uk(EPE1oP z5e@Viyey<M-5sBrvFf_u6`UZQK(!r{^m6|MWJEK9&1hO<CMDFEF<QdSOBHV|nb5*3 z+nDxG$q^dx4&ZAp>!o<Es3ii18vzu!PL%<sLK|71bR1b%wzV_hM!^=<k_BZ3a&GDe zxJrG(3%wQi+ZM@agkzBGZH?s`ZwJq%J{6)3c`(#;$+ld_%~mXS)bV{frR_p<2v+Mi z<;I&K9nwdx2TB7uA1uF2STsE8UJ9UBN@+DHdU!V5g)8XD@mAvyJi4ZIbTr^u597NR zjxk(O-#=W@I?Q|4$;%8<tA%bXm3$1tal5_{!TfNiqh+Kf_Y;@ABqvNfko-c>^yT?$ zmkP7i^o^u8AKYz&<YvadId_$9%@$_Oe6fG<;2Q0v5K__?^ZviCS@pNya*{IkQrz)f z0zQj)zUGcdvD#duWn<dheJ_yT?NOsd{lMJ%I7q>Y@Lnp-@OEf3R5gqE*9v<0(sH4O z&Tnep8&rd53N_SkAOVa&tzONFpGG-S>gzH)^L-WVht#Qf^5Q=zvygtuBi`{PC(%hn zK1sQqv6@COGMve)#3^V;D5^2!m@;49nG7Uue$*e6O|?<IOctI3d@J3aM-nRPGT>$f z7rMyrVloc&n)X%ZVBj}K-=?zu$Og!fKOa4(kTC7-=pa%O21ru$Xt1-^PS#-}qyVK+ z(}Rmps63%0outtV!k0%EM@F&nWFsRcEGDMtc)}5|O-EiDwg<zeQJXN2j3D?q5w9Mj zmUxLA`97+A=&%+GE7-gd&h+I^gtrFJ@>_Ol_4#uT{uG!W057PVa}`eokZE}9B)*4J zpf-dSk`7a;knvo|wB_*oSsYT8V3$T~Qv+_*7z7oKiHvLq!-VG>;v6my5fR)B3+Z!z zihC+IQo$w!W#AadAsPe9X=utv9zbfeo4Sl{o3sfCOeS02$Fpjv3IC@rD5U@J%<XM% z=ex5XSD-{gKW`N@Cogf50_oNylTJH$FqW$g^k)uFWkRIYbZs_3v&IpjGqA3g?qY9Q zb`Za640Q0r?OqJedNG(nmJQ~2aDp2NLV(;epi&m~JS{ww!RIc(4-KRNoW&vXUf>rD zgbn{i90Dz$Ahxgp?B17_HZh5!7}-#AYhp6+@=dCm>kuDWf|$gm;%0pKbS|C8f=z>W zrwth?>%+<*n95X=5r?@ZXUYj$pTG{JPh_n&Lr41uCGqEkpld=9;96AoCIWYTf(m)d zI#op#L)9y!%Oa$?Q!Y}ifWFB?sVmIo@m$UyE_0TTK)hy%Nz-ORMq+K^Z>a5}+u$Bl zjM%q^`7|Nu$cC?u`(WouQfs_GjTyBeEpUW%2~T&YB6+<*^w1+!&m8S*O0Y4UWjwAq z@Dp@<YQ%rj#nVtNl#=!s(Y=J9W!c?H#*vXbYK{@ImK)9&Iac30UPsl0zQp2UH(?-( zVTbc9V-*k1y#VC6Tw+ubL-}${a!OEe9sS;G0Y^`kRIs!&kPSfsbR<Nm?-r?ko9Xn7 z06!EjL%Py3u@)u|?pFeU+y|h10R^d%MbUMUWOxBJQveAf{Con|5S{`xL&h^bMGx~g zF>;9^OEgg#kMVV)BIZqEtyT-zga>JEH;@a9WPNB(Fp-I&*kql|kpiVkN;KFo=P1iz zfe#a&B<KM`*6uGq%ND@NkjvNs2kSi26au6>PagvY-Fe&Wi72`h$jI0K(x<$TR0tLJ z%V`t2-xmh$dqg`}Ge=0@h}c9jm+x|m^gN&OBmDWQ-{N9EQ%(XwGf*x-;&qN72h1a; z7YgEW5|PaKeEi&Hq|1ZHdAbR|^6<8ziVD5;;a9{zT!4R?@2vzbg5qU$N7#PJtiflj zu!-jAdrxkQxsBcTY+B|b1>~k}@obl<nnkQ;uK-#J47@~K8d_x4cMqw;8>0_XVmKTf z9d~&ZWq_I}6rJ2C+_t3{2?+BcUx+jjaJgAK+S+2LRj&M^z^$WP`XZFMwq8R>Uem#m zPm`ZOHC~W`ihF^7cae}}VVkTp5_S?!W+2Ws1EKu`r*x%oYW;)3=zfb!_@7+?x;D|V zqOMni!}u;}@}C@S0+52}bVm|_RUu)OF_Lcap%4$C>lP-qP(#=!%jw)MD?P5f0MPS= zuXOn9KTD_4+lvsF8wtV@`Gpb`G2RC|Q#1)G>%=wJ6CcPD{v@^tg2+`oHH(+hgd75H z>$KqdxrdgWD{oO-%W^oz7e2@zqyotUwh$s`8)Eo{m5srZ$Q}2e(x3zc!RbkGo7Cac zOG0B;a&1gD^$g!n@{5_a<qx@vk5N)IpjbINe67V=5w%+N!$FO<wH-DIn7!4D%MbO> zWM(pJZEJGZzu)9K^X2B9t@mGKwn>)i1?=lbI|Y{fakr1)*DbKWlo!p11(l(OOm+OZ zEicWBFIYSWObYa`UPNS-3g5U%`H6;RFUpWBrh{CS+~mF;u`V$QSIqD2*gKnNm&gc= zoh^BQP^3m)#?xRz<4l=@mTS*{DV0{AJzjneAqXtVdihjrhP9Gq$MDc$ms?20=IoQE zmh-YsGFHyoHWJ#pYDTgY^Ba4-<fuQ4l+%?8_=*VS?9LsA)u_|Dnlfg9Ve{i;!|-MB z*k-!NgfPYA)Ir=MtCx!B0uT-`Zt^?x<1E{c9&6h65Z9J1b?7~*a-xJzJ6dgQG>meD zStyscNxZMCmicuQG;?8K&0D!f^-hDS>6BgL5R)pE(5m-X(W3r>%B-^6j@C_wTZ+0g zv5XYQ^vvcqnN}A4>gny?+M$!3JhXZ99!^{W`g}iI1NxJ3{E!&ljO*@eL1;vmY)T(# zK{YIQeM<J_r$)=CIU_x!G)%qmIKnoEJr3_?Vz0#M+DiiCT3T|hXA<=8>{)faNonu+ zIUgIt@A&H^=7J3Y$}s%EYf-bG#8?I+>a6G2w~R;|RyP%~(WhE7_ca{Nn~$uBBZSzW zwzGx71-|$+<9>b3jb5zPeL4B0x0vgz;=|w2Tf>dbdt*J=OOIV#!)`il9%)zQ0;ng< zcCr?%W1N8fy8AA6VBcB?#2>qC74=O@f^U5$!s=y0lci}~sryhHuNc<+eOKQ4lbV|h zC~lC)BxEwsJRba*ImCT&!ObL+i~b6?eU-U?F1&s0u<+b&0WSP(5Zx;^XL6(}>GXfV zI$nhD@IJ_VVSd@jtKf<3Y$m_dROT(uJQcJnh46v%dHx)8j{>Wcge_|{8JKBgjhOV+ z@8iuA%+&O;ee0Xp0jHAyoo$T(1oK1^{z(n#^$%L3`z7#MHim4g!nh!~L@}T8f$3Kz zv{r36qj`@>b=2Zq*qAz6j1Bb4D=Ov>{V6&@R-O!23m49)?4@U+erKGaTr5XQKFM{J zl{g%V+K^CWx)wTyMAxb4f)$9&X%}_*KjtV-)hq^!w6Thy@LA0?Ns((pQM27pc}VUJ zse~<%k;r7V3WWatHYKAwaMs6-maC7qqDK1;J3j??VBOtRzhm~{@yY8;iWK_}@8yle zlS0z=*XramM2qy!pu!%vJpKs<+fjlGli_A;E5Mle)%Q!a4|ajUg0(=xHge0Q@^aq| zBXZ-Wea($<-?m7D-mlZ570?2VWZw&A#*9MIy&$aKBfGk{qiucuMz<(M&(h@r>Jsmv z|H<ZfK@{*z_c&Ok@L$S!Q7$_f?)@!Q64n?(XZcXv0B}y(1rgITip=>`_OCm-<vXx@ zZ~uY2LLt#fud+ui-kshKlA_d^!P{4m_`ZA+XFoncASD=VSPV;-e|XZdAA}4lDWV|$ z?#<RFTL2-N%+S>;ATy6x?yTCYH;%M~NV>ei1kpaKeGC!ujz(ha+=zZjf16JW5sFa} zHXF-3XwEF<PuY!+>A>HZ4icHD!t|*%`pJs&DOJAT75eEWF#1rM!jstNVPWf4x|@+7 zuh^=p*~}6*-0h{BQzNjMf)R0vU9Q#LFdlsZziwA@<DKyLwuSb^PwZZty&pdte~OK9 zA85^T9?AahUkf#1L4^#L7jbmc4YM@qt>@-!s5O?rmFxpN2&^?9rX>N**)J2|(^X_a z3JIB1@0j*>ZxTNoulmh#jl<JWUphTr;du=`Ov-x!Gu4uMj`Jx2wX9^oe-IIN?98k+ zc6JugJ+AkX#&Q>pIIppT2-=?GXc>CGv*5924ZZ2Z;kdiA_Dvg3@`k|CkuR>K)^Bt5 zJ9={%9~-Q9!@*oyEb#Z1gH-N`oYkoQngo%4fPvfA(|HhlCV``Wxxmqp#Nj{2h`=O- zpfF&O=S@0UjX~&?1FN*&Gqev|su>{FPgx@pX@GUTE$+YALQN8G(@#kFd%x+jk>qVD zU3|6F@&6-{wQ3ruufcsPADnZLqoBZOQWMdriIm#Jd1aMSb;ce00{sOM_v^TKQ3J7} zsXP2TEj~Ez+LfE+2i3|ig?5<|2849SiFYiuo~$bPiZ@O<adD%#?tRv=e3-z|^lgub z${D}H=5paUXJI(;*R9`CG6p7PFQ-{46&FIDM(U4qHWV^Wv5vH@M|@>B97-I0UrgrI zh(gD9fSP_XszDwu2F{nhK;KdsJ4hymX2xq{a%8Lhps9>PE09YMKS$2)rGjlnC=r<o z?Ix$PlC>`tjWm7o{BPf$53=cvUvgJ^UOkHs?h6{R_Kth;y=2EJ_5~C;|6_aZqu``2 zH*i2RMsazO5T!4;y+zo!9=*_24h>0p+2Vhvz*Q%`DLJ{gss>YZ<%#oJ4cqcf{UHj0 zw<^{xdFNk0X3sVs*A4_|=U*J0G}Qhw^FE+_$Y!1y=9TH5cPYFVMX!p8Kxtf}(L)U6 zia(t%>puDh(KNC5HRY5f;!4RV8{rJZQ4!pFV>i-r`-LM&UPgbrqI2x`qk-tIxA$)C ztSC1RppUDJ`t+mAj6i#g(}K%Sn`8s)%bimM5dq8=?<stJNA@jH?^f;ea>x8)g04eD z2BDGe`jAWK4l*9mT>go>b20B;V1}L1aW=@%pK)@;uYx(9g9#I3j+*`~#?r#T&OBmL zSIL&G<!RkSttN}QHiJsr%Yadk1%BmOyNCMnm_DlVTQ3G$cvWHDaiBh+F1xIK_h`@9 z`}_9&%l8_}Z@nV;U|;)ea(4SG@dXj!_@_R*#W&^qwE&}DJ-5mS3c#@ST5BCd*|9+P zKq1YWXRC}%ZE+BKxfh4|a+dyTjtAY&bECtaFBbV~t<alk*G05~um&1?p8#sH`H9ng zwv)A#C<Ms*kw@j+IVM|n6G}*9W|QX<f7jAn8k!tVv)2gWh0r3f9~1(ScgvnfZ>`ME z<X6)-WGzMC7?1x{S19xOHH84f-sVLmaX!EjJK^Cl)HehKt7PnBzrWJ~6&0bhxP3DN zO`YCoQgn0WrGQs@;>JN&<FJ~+BPPT;H&sJj+mr4e`uh~x5zjbIgb1Q+OCXR9F!9Tq zDjjLIHbbvpXRP`5=wNp5a?RKUddw$zIE#7@k*2?xJ|!vHhN0Wwlag;Fi6JL}u!TwJ zW>xq!2=Zr(D}ZiSfLR8R>R5BttM5!2(ZBuXDtiLK21Gz4iX0GbX3@Q%22G&a!c$d$ zqn?MK9r{fqmmVzem=4{>8frOMn?+Fm)P6rq+DH=4p?|N=FTa(k!sp0v>2<<2q&y%u zX_qgIK84{7|Kdr1w{nD<<liWzu8X=*TD9fH`1q?OKebUQ&8W2vk`p6G%_m-a5E6ut z7ZUWb0@raM<jMKBXcm3v4b$aiDwhs1e5?A`FN}}Lx-Z==HScl1PXEg#ed=vcgX*dS zk(ikG!Nm;Ghb%~gt>{-&jP+Eg5DTvA)}zLjV5U#CuJAIa85&pBdE_N2Ti^GVABqIN zQr#z?7A&7Orbw)1me|E!EarZ^R^x<J!=x4@>33Mj&&<f~oh$zyNZJo{O1>BUtIj6@ zeJy6{nDL5`kl3TpSb3xTF2Fc1f?M?(T))8NnmIUqp4IW0u{$}RqWZmbvP97ECZ;>u z)BTmp98C$cW#-QV(?Je+$fVrI*$OY<+{KKN2lsL(0H3_V)FFG90q{3Xxs)8Pap}Eh zsGnGMbsCDP?Xx|*sCp0Ca_P3hxt7vyeU<T#xL;G}nxHg$e>%S0R46dhn7*WqJz~Oe zUxeEbgcTs@2F~B4li3LIw|$nsI0bTH#SDg)F?R&s_UF^Y;69Hf_w7<1Na}gV!}Bub zNPsw}9`Eilk2)@t)ujTsrNJU0VA5AX6?mSH&M!8WOz}8t#}cq^fUKpqLePRd8-HYy z3BDNtOhF}c$lM~^yp@Dro)vRbU8EM4g*8N&U%GUBJEHr;uc`0f3EvD<tQoK*NoMT! zF{cH+;LbfS>sn>_7X5kbcP$m5mpCAlYR>{F=YqBp_0k&xpn>${&2BS~vG56F^5?^~ zGhYj{!QaV6o%+XE6{%1NSk$yks!IK_@e6jv(D3lLcd)=!Yg<{!5t=6G)w9sY6@d;o zNMrV!yi31=6JLtw`juzE6qmo7D-;p7o9kXMeM&;&ndVaYrJQ4h80S)8$kiO|7JQKa zz<F@5HWqi;`z}X|A28{e5-x!Ry^a_E;Uj~u0weBQM$G7ceSFo~WyzWRE*&XtpXXX4 zPUneU)-Difx?nhTUy&&mm>T(|=7D4?D^V)!cJl<V?PZtaMoV}a`ihn8UDg_N?+Cmi z1H8`j{KMb^C8`h8=y$S#!@>@U=Po;PM=*?pN`=Db3-t~AC*%TANr^4>RU80L<KT{? z`}0wPMtzGQlR2Gj2w+)Qrmg=$O`%`|$NdHl^i}aP{kf-lGVqB>`fk+;6JbV$SK7M1 z7^_cAKPI)U+u`fbV{4ENM72%@7o{2(sjZy>7MjaEXdO_+%k3;<#e+~_xA;D5i)-!b zJk#@}t3{sR?$y{w2H=h_yqBMNM~*^(%cJgzysPJ40GBI$v^+x^7lRg_Um$a>zO;E9 z04Tztm}GFH*MxlnS(&j+FF`(!TjcwKDunFkySE_=tRGF&E3@AM5AKq1f!mVgB@DR$ z^Sy2-LF(+9b3<>wzI=$w34S{06LN01G@zvNy3lQDRbBu!9NY0n|KCv|@oddvvvBRY zV{3Z0xAQcT7^Amjsb>m)9dn{TRIT{vnT5f%Ki903nEA-`+&;^U`1ZDoXNz`#&N+p& zDWqc3x^CwM0yR6RE9(C22Keh)_$@}ro9-=g-@Sr~zTY27e)mb|S2@Ggs`u9`zdm{B z{n5(`0&q!u#80K-LtQ;61o|kOJl7}Wi$^8dIYn%-=ps_WGh<^BgSh#iVx%&A>pj^o zyQpR7prDDe5BhHh_X1u#$ZELuO**thOldsWr0B!Bc!h96Y+GHSEi->JamraPL#{Ei zyH5dtG-fF*@RIHok;YoTRTZU?hV1$_2_4K2d-5ls51{3XsQyP1WFT)fV!A2<K^m4A z85u5%%DFc>CXd!(rGQfR(CBQ0P((yflPau&%|LIF9qIMy!|-*j62D=Y&f%U<eM?!u zI*waCgD4yha!bEU&3~Ud3v@h_+qSvMv`VN?O7aXP(K8@039XQJ5u~GVeOse{{TTp| zJ30Qd&a58Hr>L9OyY;=CgTh6^*7`mbluYH^B%z2C*rI&sC1NUHp2eR#cl=zfnn+?& zOCS*GHOJ>RFpInQiE$|JisbHR<}(_>R2N$tr4l@@jg0<eUYUgSZ9B_-m=vxeN4Sm| zauxrGv==O;t8)NeP294Y+^l?KymRwyY14JNG{N6Sao}3izL|K=Tq&BX{l9wAz2u<u zV(L!iGogal)yU~lGZSj<cF&>Q^HsMdbI397TBL5)<wt8kST;p;YI{5M_tno1vG9z5 z;6hU=s-o8Crq5b<u$&p)yhzPQ`a6$Ekat>k*a3Z(3VT<bg+s_)VRP;0{-?^xp- zFAvB8F>anyiP*AG?t$^UscKERV?+D`&3Ttj>F2cQHv$w&L)hcvW3Q?J0l=FfGL@6a z2+E~wSh)Zp(qziUm$c;h5F{a@z4zZ?N?4yE7dVuLp$I8}AoG-j%qrZs1l;5xRi(=` z)4kWkwlE7sC$Nw;eF_w$y?>%!_@Vu%k5D)es5m4!?|HBEb$WNwOV*Xmf5uS|wEwA> z8u7%T_I1g;v$X11YFPo^>WZzWMfFI%nJ<IkMlo}9XGI3T7!3B;?H=|#Ihdc=#>w+4 zS$n<NuZ=l+2Bu;kna>QDEmpiX{FWw^7@#<Cc2M)%p21PwyaFt0M-2Epx&r@F8I??k zf`aYiIx`Wk^vstYx@w7#_Cq_P+fUroLURK%yzY+A_!(TLnDW@bBuSLHz}L?ijCLp8 z%_d_4aN;x{{=<-F-`$F=y9!nn6okrL(-w;*-|F%LQshk71|~me5`b%!wEU^{IqHHh z-)CiFpkenqI!#W5J@=cXqn4`Hl0S}})JgORh$~gTBvLPkxiEb36bo!}=EM&W`2mVW z{cj1Q2!V>Bd}5L%f+3_R|C?tTpKvFig})|(e|toeMc{xJebjWCxpX{2NWc$nD;9$} zC}Znk16N20>@um_XEUZT3(4GhW<AQ5GKz4f`KqGzE6CadD^J%8PlRh{2wbXMS2@o( zrFZFf76te#+Y(v)uKQeG4>!%+Urv_4s=4t&$aqg8C~Nkv@m+-shbrZcb0b}T?@}9- z(_YSB&RgoVmen)n+r6FrGo75Ei9!)`(Ue5f&gH^VD-6qRbfFnQMO=BA*GKtgDDIZA z;8rEHKCzkpc`rDjCdA9*d*aMkGXyz^&rqTGjys4S%<#af))brH9{h|S_JSL5dR!&3 zQ>2UnC%F11S23{PiYuUy`-t>wa4PEB)_wc#0-^1CRubmb{uFg@H^-~iU{;OC*1P-L z@-3hV;J0>s1o``VVw4ZSEpE^j&;rQzS3zVN#;93?rw^S`^wYv1pkSBJw%RMPru`Yd zu*3t|5O9FTj&#Gv9y>SlIxZRM7}~?`(Qb=ZWCNgrzfCil9ULjew*@yK3uaXMR*%j2 z{qUS~`-hd3>CBy1NORIn(Vnb|8UHj}Av%A-8rG9Jep%e~cc&=jkfW3z?quT4TIyjw zMsOnL`c(o36k~X`ya^Q_KP4LuY=*|w@d$M&e+f@HhrZRN8r6C4x>(Q6%2b=SC=1wg zUrt**n`&1o`uv5}F!^Y7EwxG-eXEc^07<FQcv}hcZ%htLr93)3fGXugjCkR3dQcC~ zP=bInw2y$?mDBVjS4WGYzw!uBqvwp}{(xKt;Ox!Kg1LKV@4H0xM5L(DJV5xOCe(z* z{Kx*84kCE)pCbH^Grq|l|CmRPG>C}*$;`~+99!)IqFQz+GrSKf2$hTH%gQ|d#(6jN z%7<kAT~y=i&L+i|I(0Q&Qi65E=P#ed-8Nq^O?8^N539J?yd_=xefoRwQ1(T&+R64_ zFYW3>+~eHua1HYtlfUv9SO`$(y;Q?L5#?MB>T9+IJYt)-=Mse%>WG1R-Gk7ZZ^~p3 zZ%IsAeJ|DcwkjA10B(Fdr`tSE8!)_ns&f&sFA{iFq<y)RI8qQlz&2kD**ZIQE%XfT z-g~y6Do8rq=DcWJvJ3+g18eya+d1n)nZ>EeL>RJm;lN3R*y<U+gJw<iR%Vqm@yUtm z2p|AW(6sT&A%@Z`dhPM;)>hZ^(;uO!o;Fxh8mpD@p7&`2=a!d=NA+}(D>#-DRRVQO z^<V48@1VuQt)ud!v@z;9Dj5h{(Oq5n0n-svvM`#$!WAO%>tw%dM9|gp=|smRRIn@W zh<>e{0cARSU?3HH=FaE(-<qOPYw$+RSp882=_2~2w{33cIv0YpiC@)DbzzG%S|HEi z=#oOJyv-X<M%#whZ;3qVR~)zCe)5<g3h29F;T(kRAsLfqY0uqs0maAW|59W#@u!S* zAo}=L<Lk{rHTYQ6JLNCx<NyxA1464{YVt?2)yE4grc-m)PIlBZw21uGpZB`>qdOr& zLP9VN7I7jbCzw-HXQ#OHY9(6|inYD_^5vMME$i2$Am1%^8r-5GRpoT}^$-S59Or&e z%tloLmCS3u>a}1_B9=}g_ZH~=pt!mp&zbpp%s=+^DW=)9H`uB1FgAo7W5n#H$5gNn zPUX$aiek)DN~uZ1feeo90tXP0g@FC4#jq~}$0t?*UJ{}S)N&SZ#fJJ2b!QCRX2C@O z?Z1}{Hd}4jE)8IQU86%Wf(f0)6~n53!Wi?%e@(d_0OuREaSNRkW%a_sf**1FD*<(` zoJ#jUTj#%3La4mW6>7)2-6DTE!5WL0=zSFWBsxHSKZ6r^SSd(s@W8f3;h{4W$*=fA zF65DjPtfstTBh%qZPZ*`4|mnm#fcm?JO#m)nvTZS+9AinP)i?`3^E|%9p~%_(Qng> zC+naMakJx9T(DP-!FJ#xCHa;oqTiSs4tL2od4caG)cf-#--tdDt>lVH4mwiP&gQ+f z(k8z5*d5QZ=tlc|KMhGR8F1u|TV^ocwV1%dSLIV1{fTcIBXE7S3r^zyA<5)Z_~#1S zf&zNINY>zQ_68<da~|U^qkl6ceV9I!Q2{j;j!xr5#@iN9BI8vwm;NsPvHxG15-)nz zPxGP+Sro+$j~U}ltoV<#mWQa<+96SD?Y)w}_jUc6Z^=T)#BHLiU-j2UyO6CK`k9M^ z8};xleCwS#G!Zy}WcO4lMA{;Q#LWKA;)F2?p69}FHO*1f$?w+&<);-}@Q;Z^(X;$C zR6a3ZuPMg!Na9E?#t2{~8m(IrQwywyPySXp=eMzZw&k%!G_>g8k4lsh=(99}Gi4+< z0v0Fsghb8}DQ(*fhtg%=Q38#f8W^<P^;}<E>39AU0nQQV-z<8a`Dzht&&Sgu<E>OE z=#j&kAhSF+Yv~L~31I>EMm0$Zg8~BbKgrcJ`JD6+!1k)fzj|~soW=_XlLAGYXXi&m z@0;p`xvna*j|7NnL=ZD~-JM}J<L|NC1w$CBCejj>7M_vWz?&GFk>Res>x*s*B4^rm zE)b-2Sc3}y93k4toq=AZo<oczhHAn%-eY|L<PqiGlnrGxEu1Qk_84B80O#%&<2kK? z@_a;JcWP*|ujk9B@BKGl(ipxvWhX!?FktsOzY+%_`e!%6H8CQ<xh_0C%@FKEvL*id z<JKVPp&2O20s*PMJoQ&bqKsWqvsMyTrgq;l0_SP=3rtMm4VCA1iO9^t@yiTAvZtfe z{XYx{0W|DyPWY!U?zjJ2+LVHe{>N+5H;|P$=p?4MN5PXW(&w=z_Fy8qYjWjb*i(Jc zH*1b8#QDG=O~C$d293-tkOa&6#y*U491e@A_gz(X94X(VRzu~rphoo0jg&oa$Rj{? zne-7+FH~!pg|7r8ed)nd`cO<CX8EEACb(V`^lcl|!e6j^fi0Jl5SU4T3?C!(UL>?f zX8a2Oabglzfb_yFKJ@Ht5B}_sAApqjl_H(>{&mUU*rlr5UR7z2<GE5G&NPIIj1pk$ z+l6h`*VVG~@A{I6f491^vW{N>fpRp&Z#SYYV+kDzk65jRP8I}%bGwk_%JLB;34_Kc z#1~o=TJ!<pm$xB+7RC>yw#gTJOB-w2#lk=}6vp?cU{4P>pWJ4p^%a_`If$7Cy@prC zCdd(oZQgLp`k=_A6zn(>vMi*#GEzBDI_iB!7y~Y>V>$YLD8DcveVPxbk)f^zq4@ye z{WBzWe$q8+fuNFx5)8f^VLwq#OcO{*F1Wy=mmGPpMbzSu$>cnvoLx>?XYKtO)vs~F zFUIFi`Q(2odw;I;Bo<ggIcPL{y2c0QOQ`(%Hazc%dwrb?D`{XZMp|fuX1+l@3ypks ze`NnoDGJ<0XgEs?t}6r=fVK!~FOYzX^_0==zr*=<K&(;P`WGFAqbSQ$&#}5q>J|`d zba8Ee1M;Rp=dWTYkK|`48m)Vh>ytuWJY~4E4vsdQz9XQn-E(I7hsuxKKan90@L43R z0G3at6g4qe;{7pKBk%E?TUDBNCv*of@&%wK?_@Z+4YxgxvxJG&Ed0Y3gbd;H9%MEJ z$UcrCe#kyrl2fd%|0(i(xSc+@S?D>qO(Y5{$bcUc{?dJKhGgqfYAVrZi(EJU`WNM` zrB|ZML8gSA$F~3}?CMCs0`CcZZGxj3aGr)N*e8Ii7wVSS%W?Kgt7p8{M>D_AHw|0D z7)ukQh67G&HBF2*A;|Uz*ZjChQQ|F08_YuWT)7@m)zE=!M!;`)qSEuk9^BhrvnB!Q z!$#hd*0R%c_-&o<Mk`<-%b(S=s*k|D#wWn5|8Ft}5)?@OZ0=;u5N0Pn1MYSSMEE+D zJ`0smk-o61V7<Gww}d9OqzlrGdK`BJ=fcoJ979Sbh9BZiNu}kI31;oVf@2RL-SOJj z&aXzs?5h}cI&gg8NM)L;k3p$^;0bJ@lWw<Z&LWy*@CaOl)nC}sFpt&2%|QKu6h%p< z;+%Mk2#^TWo%y}Ie#-8TqohUuDuAPPj8(NR!&^B<PYiL9>wqf#4*)ELp4+~LPJ13j zhyFFB6z(9wIhzD-S%T#x(lJ{$a4HQ)3tQGFp3GWj{n;_cOgsqvU)~cinYe=$zwi5u zZQ%_#L{x?~CQN6qyK9GCoz;ToMvcLY_hMUSE|K;za0)*%HCh`<Aeg{zcy|qy<)$|~ zlctec*58Ltg({l>3pHt&>TxVM;sFCE7`XH=pswneRNs}<?U|~HR?1UsYI>=bN79zm z@RQ<tIMc+RI~724;t%>RbIR`rv?Zw%uc|zy5<_`!O0@I>@F^u0BCQu_&Fq+`g!44K zojq)AZVj9Zm+T&Ex}gSh0LX9l@g#v8r>I;){`pAe*8hnyQnGq;{fEnLg)q$;R-z%w zN(`iLCVDEjnY+GhTw5>P##QU$Q1S{p@h(KVn7YsCOrS=O0FwAUV+ofRzYt0;Kjip` zjYvcVm2<0dU`3rM5b)w?18ugzb*}UM4HA1#yNwqNu#ltQnYHy|z#HXW^ExGKaPQQK z-FXtDb?970YzGGna`r!O;J*iP0GTb$4sW!E^ock=;3KR6vk7t~5>9K|GCv4)^+?F_ zku@Yl{k~BD)>S(>GVJPoKzNGTLi==F9Hf)}?{tNftZ!^xBphMwuIUGDyC}hQy^j`E z%(ig*9Or|?AAlYdTtj0{qH`xz1)H8qEYNu#hNY?y3m<f@OC>_e^Fjw);9@{}gjJ)v zr+FiU0Pj6bs@%UJJjn=KUNwfW$gIl#Kla``p6dVoAAcSP$2ey8CW**ina3t0Dk&i= zq!JO5acnZ9Y2;*-?8?f>3K3;gHb+sig);MdJdeZc^?rZ8-|z2tyZ!$CK5ws~JjY{P z*Y&vO{n9s=`5``}Z@wHwmhkwEZGX^82ezMvBwv1xN3xm_{LHeg3|&24q(GTYOc<4b z!=4~rk5{!8)<ZR*+;qCgUXi>{Dz)|{#vRqi&PuMxGNA{Iui!3!v41sFpX#DpTu!hf zz+PfJ_hTHpVpX=%cTT>kcx-|@>#AMB`}&Spb!t_=Um@ddAiq#N3f38fD(*>ztyfD+ zN=ws{u#Te|L$=VLL0a@9O8(G+M@=kn);nDO&UEwRhaQ(~)WJ6F;DM=6q|_Ey?R@|K z>cqLfj}K^N3*6zUOs4Dt3BiZiMr$@P%&#yOF)F@Wu_+%8QWgMVJ3gkqkui@r;`za< zQrG7ear)U%7gkMfVW!n*x@pQ0&VXA%;S8i*Lx?F)T#)P~v}Kg`QOUHTD%|%>Y=hTV zt;C9hS_WstkP57;MZa(;DCbmvNF>0QMNNuu5RPO(F%csFRVOYB8n&|zgnGcxokwn8 z_x+5G&mHren!us$LG&u(?i3VZa5V?rlVl%SuhSp==!rZ5lk}G8H~ts;4vHajw-U@| zMNy*P?(oD4BDzG#H)%6?O6QUH(%*lXV{`Yxw)Y>cPC!>GCn9n~)q~cZ@*bAm_*lO& z_czNKAI`Nxic?INz157X{t9m_JVH*~?~(ROlK{4n0YIe);Jy<$P|6maf}awZwoZVP z5rNuc>ZvjAerzdt(87)8zD_Ex^8)*l)@3Bylu{YUt!B4>by<&9WuJ}N{%ik1MUB`Y zR<@sc2R^;_9P?OQ`Vq>UEBao>XinH!|Mo9udPY2_Y|&}6yBA%Ajh$VdcaTU(vy&l_ zZ+6z&+$Sb(-kv2dtU)#Z5a#3Quz49g+v_q#_M1no(|u+>3vr|AH`sU}%@lBM_2d}p zQDD!Q++qJ{Q{$xQ@tdkJO<xwWE?b(MQK%a5nR>g9P@S|VifSrc^K-hUOF!VUdo5-F zjbQe95~ov}b(l~E;S0$fo_t=b?}~%USl!VP;dHp<TO_qy09e%Zo1E82l8mawUvhIT zMi`4HA+yi`^WC$Jz`#3DbJN~yd}h~H0XEz}8LPnIxeXki4U?CB*fayI-%*jBLLQBn zobmZ;j;s>EPsiOleIeM$7|!daXTZ1Mzq!6I@!zJ6Fjl6O-rACrOfJG*R_w74VdE;$ zJ3+yQ#sl36-%NKGatJ77;JKY046ueml;cCWx7L><pLn*DL=4o*p^c1IF6dEOvPlQ6 zKh<DAj_aku^l39Ww<KO|$uvLTV5icB2Z{;)lpN*;scL<S@h$S<k3{l42~B;91h@iu z>nyV4RD&atv>4>P)~d}kOgD`9@$ZfVfgkfTV1tlW0jWbrt+E|8xwx?`H0agK&sR!6 z<vOv*v4$s6V<r`+{HU)ZTvRB(@Pr<<LLN0CYnDTYPE*qx&oXnAxFd3yyF_UDIKuQ; z756F0>%R^Jl}hg!o+daG>fs}UjLKe9b6fn6Njn%B(B_8T32U}b)V#LPr$ys9N=J&{ z9!~wY)|i^2Wgf5>jn?QbD~}GGJ;xpkP<7JgI@k(~SJ}><)s1=DKtg-UcMys69S{BP zPDxvZ?X0GyW3NyH818mMqgi;JQ!C`C_{U@?+Ud@?<EPjorfg4;Q%d#t)T!P4d)scO zTPC!{nX`h|cJWV%Gf2OF_FNU@_&8MF{KIcNw<i>_5Wri>E&JB{c{IeXJMSu6D@W)W zK_>%+P82KGGdENhL2U?c+-tD7<P5mq0%TohCrvM`VLF%2m=3w{AzZA=WmC6w=y2ZL zzjbo2HTbTOW`KJMhF}xVKZZ%|G@x(a#h=R-5ixykcbL&QN<RyfXUH^dhN61*yeP{0 zCPIlU3n1g#{e9~fk!wo_&KHKfp)5fO8XK1vUb@r-DEQi(?y1a34FFpg$ffT2NB|Yg zQuZ)b+@FsFd*=N@zt5GZN*0p)MFSreHx;%|2=%|b<t{;wn9Mk4sF0ZBvpJd-n)d-p zw<`4?p-mY?C^b0z8ono6wx=Z_grM{d4Dcs8{3giYw}>vcQNC-_b0p4K6I|TrNBD5X zlO$4JnYOmZboMfmlO$euMM&WpAAM{3L~`hyhvO#7OO9bGj|eUaue0{Qbwaz{8cw?% zkeCIu2S>8-XUTF+gGV<PO-=?2#ew|vS+TeXEB8<q6~VAg>9>*Vk}3gzZ;u1tEB-Sc zw>bk+!<!bTJ8y-wzVN($T{4PdNk-o=N=o>hfmH61c4?QqBO%3QY-FLVv%^8L<DfQ{ z>Gekd!u`GaZR7z^heh3N5!1zqZLb(G{2~Luym~sFx|qd42`HPG2KE5fMABV3&@Hhl zUKSdh`!Q*+^@Wn<Ef$D(n&|^7MB~1ar0auj*LDYvtnCxjZxVnliELH<3YZgpCh-xy z<|@d?Eq)D8+?}LrLM8W24msdQWQMfl>0&W=Pn?OOB!-n1WPt&}C5l<n5QkO=^ok$v zQKaP8eShfgF^%xLened^q@b7FF{hdRG}A?Pp!A1XjNGQFj+kgfvB7m{KyyYpSloIm z!ipo~T~PP8_uW~NIgaG?x<MhKz#5tx#fM})+**IkpDB?H)0bK>sK0K#iTk#shw#96 zR@1>Hh8#&x%Ir1~?x+!rUb^`2PRp8j@!zo|q)__1l0Z<HiBl>=<no-WzPRAxLR7_| z;2Y=vn0Y;rRRUCl_3!u<WASO|5h0zvo)ou<7kMPsM2=BzCtwnqNh&sUpLzg%0l^5% z2=wPI+Uv??^_UAtgwkBF6=YfZB5>#p;>OONgf^2D-uGk@7XrwF$W<ViK?91m)Y4aF zl7f|s;~%zL(V%hxmEk3s2Dxa2CGx4WC4`J4KUmd#Se&N082Sl@T6Ar{t|e}S;cj6q zo(jsIDX-OQpf-s(GL`z`E{wz8$*L6GBjn;dEsRr#teY68e>Cz5Xpi*zeYrBA%y-j` zcrqbKu|mqgk-`2}Cp?!?0PH<s*Sg3}{diTxF>{yQ2_*6f`ROr^H;<YZ(`RLxKi3FZ zn@XEPUW3R(fry;wy?kwg2?DI8e+;HwbRj0#k2f1m_xrvsdinlU!Cbc=Z@x9TjRPC& zvF(pH4osWx8`^#KBRYYW&c;#Y4A2J9N1>ET^7OL|40zpBKGz21WKT4+(L$yA?k$aF zXu0sV)61Q}kYHme<lsKL>v9SSCdV0=xIW&1l>9j4JvLT{DhROgSX~?d9-g+aA_npB zC}8Pj4jM@Cd4fqt4u>@JUDL~ZL^cS?Bpy~X^}C3gI{tM}-hn9rfwwR701O&cqa=v5 zH#yV4MY)%RiqEUPO7`@Sr2V47+Mq#?vWU?N*Ie(imb4gZ-%)tbV<nUQdL~DY3;UpC zB#1kD9Cz*2&$Vwiek#4X^_TCfi(J5L#4P=4)HJE|g3GwpIq!-Y&E8K(&bN+!n!H{+ zAavbL;KPyGSzo1U9gi1Ag~E?(m?4*kNomKu{mi5_gEBc&moQg9{j^Jp9lmy=0)^YI ziAh$8p$OEt92=zcUBFwcpbRt^mU%_B8zF}~-@$3x;e5UvqAz+s#0*5I<Kztvxd7Z~ zZT+Jm_w2KD&#u>h(oCbb7<*>&!l?13W8nQp6#in6;-I)_MhE+f^0f>zvL#t-#_Rra zaY7%KTlEZ2^PA=mME%mq&*z>@`@qT>|Kpy{HCY2;qvz)+8k~N%Ut|Djv`NiMUtK_7 z;w2;RJY;R()#Y%A+03Wp2lq~Rr@X@;k{)qrdNrXt=J(x9TPboS2Vaxw=bmG|_qa!s zZvn)e^G?4BP+Eiyz@V|?HIbow;<Rc}uTmwxd`7unKVUU&%3$fDgA!pnLh;r1r<+EI zp~8zecNEwK`s-X=vVyW|(9s#={?}Z+ZD)0x8u}Kzn6_T!i72OK(_n^1p7^-Ntal6{ z1Lfk7=hj4H84XUbE^o#B656cXbmZxe{+cz>T;`)<&Ctwq5^`^?d#X0f>n(-wpT9rp zno@52I<pabSS;wv=BJX}Yt-*4nKyp7eRzGY=E9|KAX+LZAaD(Ww*Y8n?*VDi+rnAA zz~n&Js0=%X-v)_ZO|ju?C@PGe-?b6XFyM5)B|D+lfJ5TKkKwpS?m{;%-Xy<zBZr^! zwR&JIPxT3rvnAK5n@G8D<fXj6$vSz-lgSi?H5tjBd-#D*^r*?5n-7Xc*yD)Z9oQTJ zRwJ@Z=(Jt3a8~PgAnP!ypwK0R<*+KYe&gz<UV<UaLKLv@lOgppyN1AA$z}Com>AOF zroefecYT~F*)_-HVP<!`v#a+cXIC>PQE>xjC+;8gr`-@9iQwYGn0iFkvv+lUodaL) z1_Q4wuBz}>ytM!3UkBMKFfEd6V?mDn0g1o3kvt}6w3O_FcGguXtfWdC%2NO2R&A1c zg|`G}IqNyu(w<zLZ#ukKPj$%GiyzJ|h7Tn*Og<6S>Mp`m%~ja=*+3@B^bN0dHe7tu zMS>%vf>}H-RU;;!Tn2#d<+vWBs1kQnv|2z`<?Y2D;ea1-cKnyW1Hqx_yTvu2(fF~o z2|weeXUaX57Xut%3FO<tY^QBUUm7#<Dt`o;Gv4vCQue{$eZ?T*`V&Ne(*(+)d50yy zkTzeC*zH$AFz^v>;J8uC3#WC_6LOK{@w)gKo(EP1QX;Q?_9PJiLMAxz_jjp!u28)M z#1X-Vb4u@o)Q(~9<@M>Cf=CPYo@2AwXQQs?>`jQM7%G}U-#zFp;E(&qwMfYGlLXKy zK9Hf#+uq9O$yJ{RKKD|F-~~e5thuzSd=U&a8dSe-cnRmk$;0C5BxBN(n>TsQSnD}Q zGyx7g*9})1V`<I-zgv<Ie&l?->aBOaqxDPN!KYARwff_7^_)0$2PO71(|(N7Kid1m z^UMkozS5I#+k9g%{Ai)e4Phm^JN24>t-Bs9tc>XzazZ}ou{^!Ge&VFnVFuRvYdz{6 zhTfu7EdJ+?CV#DcGDm&HuM1HpQDrq=?VfF%qQG3Tt%U-qWv()>c5|kPrz8gqRO&mf zX`jt|P6KKA4)5Y{e6bx1iqu1Wq@FdC$H8Zmd&!j%+S>`~KgPe?N1<2Pe%)FB_M=z> ze|sF^HXI1G{6n$AY)X)<3+*7nps?*smmrzk;Un-1Kn7UaEhkOk(4-n!;{a-o3N~@& z$FR=$+!iEUqI;{4JfGft96<uAlPN=;mXK3aw5}O`NUDkk_nuC0UgtWU0akkDU!al= zO=b4(ogfDf{Oj}p;Y-2>q3-bLRG8GBxW-rMJx^Ix%@k%t#=5{yL3^_5oWi;^YpJ~D z)t$NnVXXQQH8miQ5!d8)VW6<K&N{`SHRj&DZC{lgwParJx_yxnt&JvQvCy6Ig71eR z2z#uTPT&41b|L0I^-leRt33${s=^^c@2S1n*F0TKe1EU!Nf-y5Tn^3jZh0yr72T&{ z@nm_yLg-+ao48rwZU32>r<GD8q7c*(@ko^*v4}h^26<_30+wV~NiTdy#ber9|Dh*p zylctR_w)AFYU&eb5S}Z~yFxDXwEKpB7WOYB+ctLWCV%rY)sh!4rAhs05;jSLwzgm< z2Q2!JM&yni+=XlfSjb&(PlNs?pAY|WM|5RhFwoj@DS+)WBWP-c1T+rGvp&^~EnP#D zVy1!1){9QKt0ko)j6UUV3@9RgTJ>mx#4<e(L8WlEKbYlJ<1E73K~oges~jz919h34 zsvdjBctia^2rT=lvB$!FIjKc8O1dly#7a#Tti_HNoW5d|L&_A>PmvjAqiw@yOGPs+ z6t)(WsO0#dGi(;LJEg0qj`_SX^A^RvqQo*wYi1bZ^LxDespr^Wr_!n5;iKF2CJ%-_ zR$P^HJyUr1V2sMuPLM;sg)|Q^J*4~~RTxV0;;?w|{_obMui23TcYRU#h%c{_ct1_o z9|}Om)&#DMT~~QD`Fpf0So&IjXZEkS$A{i`?wq(}q%hQVQ#8RjrB(5RBj>dw%2&4) ze$1#Iuj+cpnsb8+!oB?uR0jmD`|<~^2+_U;$tjn-L}qQxkS%=p0Ztz-!Cdc#+nwm| zx=LtJBA?YQMKwjP7Vx*d#B0v`cHsel{uo8cu2zi*N)Y!a2;O~bS#=fo{7E>VE?TFq zqAOk8v!6!OjnQnoXu*qQxO`5`B-K%&E{((fAsysL196kg45ccQ2vQr+LhW~xEfRM? z&gJ!@9S*qmsVJ%kwYVUqn<Nu`p!W^UI}w3>R)zk{sf7R#nj1miGjE`ihu*)V&4jxp z6;>xmZmn;!7Atk#WA(i6W(!<9ym9en7zN2oAE+Wg?Y!v~>%@cuFx*v1w4!O?ZXGN^ zG7|`qKz|q!=%_n1XBA<4E@jq6h-FsIm!#&PKOqiq+qN(7d6WDojP2ue=3}W2I_8;t zZ}un)D>F%kFazf_jg1P>R-c}^Npj?%#vF~M1jXg4$H#=<W4i1ayFwDiM@LE4>AcBM zR~X*Hm9NFkd#i~7KJR+KX8Sn;2p;$4d96h=D_jHBb!=1#q-FI`p$SCwDW=r|ze_hY zI5@M<7RKsjIWl!|aVZ7T#)^>H3uvO%#O0fgGzRYcmHBT5TinH*WQ1H86F8uo!`R0b z7W7ECu1eVF7;N?QAf`x3TuDr8X;Ow4iX?F7-ZipdBqiU56uUsiHlan5e3Kl=t~Od+ zGi~Al_fJzVg$tYqziI@0CdrNc5JksMD*l8HV?*izD#J>4P`%88d%G7QyuW)em?r=S zj2Kt160<L(7!Bzxy&~g_bdu0ou2*@bU@POtE8t6+GSMtR9{%E6i*JTX3m#3bJhsCf zO4mbYbj+Ma%~tB;H(#aJNxw}$ZkhwBnXzrYOidbN7tN$)IcD3nj#gYKzJKRpt;x|Z z+kagePU$BJmLX3?k@J4KXdPJhD0hVAmS}U%{o_(UKYW);-70q1wB-7@7^scp?B}yx z94Nqa1=k~YR47ku9f(s9Ntnt-YV`WcUoB<N6$vAwoLT(4*!dEnnRNP`whCfbmsX}C zkpc;?$s=daRnp!%f8Gao4;O+9kD{P*b(lPPrND{3DxA-`UP+RJJ$+~9)Wu&9hbL^r z0nTCHc{8{ET8(0XFkE19{=oFZD{~LNr#9*Ij^nPN{4Hb6mRAk_v~C^}-|`%~RPnbc z;bhJwKq4t`BR|rzP2^S3@X?XzW40$bGH8EoGW1pS&0CbGDqXDgI79U@yw0|!|8fPF zT>0CFb*anVn)d}D%#EbS1QN67pm_sMrNvMH0}#B>kWJcuj)Or}!+(0qJOXHbaV_n_ zILiJPJBpRPdVn1|3~vA8y?<u~IK#myx_6urcDDhE`6EFvnImW+V~%^EK75z=`A{Ip z^(T+o5lWdw9kt?W!-HmeXw_a8nnwT=X#n?<)64RsJ~=M=p_7-zomxr)WD4wBqWGsr z1@X{lfJ#q&1sKXqWab7=Vn}rfIy2WFVk7nLlPx3Nx$I=8$r3W&I6kcQI%pni1Tc|6 z;W*oUhLwe}o&PynA}lx+fG#rrb@6^#!u(xWKZ}C8C|{M59=y4P%vBM)G}T&p-Jt|& zngTTs>0j7_s(xiXdxC}Wy6G$T+pGOA0K;u3BdnRo?!nyZi{&(P)p%wEsukZZF83{T zPl16V#)7sSb6r#07uVlg+>Vp^WbPb=_Ima%wqZD!^JhA25bPg`Bv*(SvE&las-2UV zRa2tbpzd<?C-^4BYCX_1TzFCrdMqK|)oFQjBVlk|kCh3~U2yRpFHO!Rv>R<!U*TRF z!M{>ViK}`Cwghs=4Ja3vOB_rs?jLRs`ynwVDeL{wacz6^qYG0U$!$0eo_oFHc_PHC zb<RXZ$4LcvAIIOdQHLs?)I0H?M*#*!#Q9T12w!M%>XQceH9@iw@O<pCHq`fEbOsB2 zEGg`8DG7?4CV+d;m=4f#B=G#ifs8M&rTs|j*Z=m8P}+Vim_&otd;-ev`hi1r`uIuq z{(*t0lR@9V-T<g*6$!fC!Z->z+yanpPo1WGTj|bAZl@7=y8}vp{OdA3Xmj&Pxphw< z5f-_Wgg9Vd$gx3dq~swU)}^ya{JvXvF)OO}Ml3K>@dX8MDFig6Xy7@fA=3>geG9nT zV?c8opQZ*w$I$NP{lI<{$-emjOuOe`lcG={Kg+4V<f^(BDOu}Q3>CGspw0%v2>pdJ z4+Xe!SZHY3l8aFsNm2ud_p$@fniKc1G73F*i|(b_?_xn<RAyGyKSd+%UGfQA$ZL*z zY9$$DF-ZYeJIenCa7{b}wv*%*@B;d)OpFEXu)hgi=krM1x)8yu9;CUt9g&J)M7Hs# zE&=>*_ejR<|LS9Divr$Zt2sRsL9?w`y|IrAAPlvK;&k*sDR#qHa3EH0%jf-TLCHM? zfQ}ELL2qyL@n1bnLcbRP<j)&v-%6WRq*5?jn8tw}jZu@PBlG$Q00n`oqPrVGjCBDG zp#b)(6S4jiDb8H!Z^qBLHr2mxGWPBw^Hq|BaVB$3KEUzA!NZ--^vn#7U1uyf;)={L zvWho<Q?1>mc7@>HAbDHb<U&Hf=%`4J9+^scNm1htMs*$yB!KPO<^pdM$aiJ?yR+H4 z`18HRqGs5~3vZ;h{w||xEP1`8NnL^)|4}#ztOmkt<GV0NBpW2AV-&J>lvN+>y&4Fl zh-HM1Xh|O*VuRgcAvN6Wm9G^eulR<v>zcl%Q0lZ7giKYTM$l;#4LY-+0pP_!HwJC3 zOG;Y0mo{Cj6^XnIDes?tMAie%MwDxOHW(u|l4Qwsb#-5c&}A1tm3+isk(Zhq!QrCd zHxzagJ+iuvKFOGwWhPHWLDF^P&*Psl&lyc|D=8U_Z6G^P<Ib`3f4E>I5%z}xQ)|ca zD*p|52q?Xa6}usUBO3;pXj%N~KxV`tgo_)5stCm2M2%i4y3u8iFdayGMBiw8F;8Kl z@izgK!b|TfsiI2<U6_W)yQWS`8;U2Ol?Z_9gwe0j&6=V0IiFCtaHX7q7kE+3KjI4g z-wF&n^r>>R{D<(`1nPP)q%NUl<4Ov{Yh@b2jaRii0@R!C#$N|a`nTJKlT5Jz1j*Tt za~_uVU*Cv363hg`QMPUcT6frSqQbiER9pX+jUnT-n7OL?jgW3%kQa_6hrAp&0U#55 z{NpOws;nD;YVFV%3vXIk=$;hKhzvWZGH*DHL5J(a;mGW8-tVSvpy;8ha%Lu$6$(02 zB@H+S1h2zdLdLpsT%GS0rY|s7oN7-y#3J@nc3>kR1a7eAlPVl_dy27}!?>GFNmI*# zUi)&9reRlq&!^zbZ0fg$u@MpaJ9Z#5KT|k!@y~i7Xtyk(vt*O*bkqW=RXoz=+iy{$ z>|eUQp5*c-w)CO#PStJNamPRUW=|sB@{8JB5-;<*iJiMzUL{nK_>2}<bG%Dml>kh+ zl-1|?fw_T5(MDQ~+*-o+OZ^P>nO40k33bBX^z*-oaQ`{=bmolQLL+lvQ0*@YT9hD{ z5yfloxu=Z0Lk)Bg^jL6&ptKMP@e!Vo1$F-#$%S(olu%)A;O5^0P35Y3QPPv&(^2@5 zEmayav=x($DsV=y!XdA<+=^!(FPJr7P#LyDA3FB}#QKbw9(itc9Eu2S{XkoR|IbDr z-NZBO9TKObRpQWY=Sz?%zv^w%O33c%jhtc)Elz}tZM7EbtwRyY0N>_SkXOhp7pTjg zl%70?AK-I!RVo}U8i9`Hfru4{s`Y+y;F164Dl!5b3~2T103=7|yR@`y(};Y9d1)2@ zUunXtaK_tI#_QN8ReYCZH*^tfSQB#~KcZY?c-Yw4+4HE9a<3P*|GJ_4{Oev06gUkC zqxG%d1&Fjo;i8rLDg8@EUI3q(z3<ZW$kZiT_$CrXwvL#`m>4uBh6eL6GWEcl7_gxC zVE}cf-yqAL*2*USF;+$e5~B$=VL%+k;(k-o<HDJDgK-2K0QZk6YENo>pGMZ5`n?)p zDO+_8<t$raLSLkx>G#lE{whqbd1Mt&_H>=-p>nz<>JX9C!A9=wUEW<P6M~p>`BWag z%x;oVcf1S(U}&5`!ggkV8kwlP3|xGA#BIM);vY?8-vC0QFx31Q3wvxyWv=8ya>Pj% z%|@1}U>12SOL&|(E$3h8?im1I^ZboFxz~uq#*Ka7A33+naG9$s(%Pzd&x)BH;in~Z zF7XkxGN;29T?)~W(<sd&=_WN))G$Ak;>ni+&`EIybR~u<{30oiW|KQxCem)NZpyrG zLGg7h{+%*YXzy__<*#02?(1a=Tnx1GYI#G)R%;Px@QgCxN`j|}&JByr*)uZ%buo9j zzT%aNiw>^<?G{{%hp*VqRNO(FZPz^d`@8k%hx`cMD>KLj6jX221N=#Fi5NdsIEG1g zyqY6se6B_8%(&c(vsa3#LfXhG5vc~~Q*ZIQ{%2*|<oYi@jruWzY%)?^9HOZ}Dwd7# zIi(fyY8{sODqMNvsY0@2-SPW7?ano^x(Wt1ig7$@Zw~)dD5bqre)Yjix3m%9!-B7R znM<-+OQ9wym6->`AjnF40{kUm7%+fj__*`^Y(9!{75yYCuA=*#IC@co%k;(uc^sti zNON01)Jg3aS8tlCpH-lkTxfv(n8Yg}P@v)P2-%=Dot4v(+a_&NJm$>-9=5MeTJJcd z$t+!}1O1ir#*9l)*Ay-fEE`Ze2=yJwd!TMjK^PANiEp`!W;AS+Sn7uH0$lSXII(Rn zKOJ$e9&YKq;Vga;B-E-mlM8`pCFp>DC;P|ukw^fESeT{P83#d@vx(=vd{~_NNu77| z%yFwQ03s#@tLM#5bE^Kg?fx_zIPI|uen8-({{_XtH9cMZt2viHan^kS{$ykJJr#}b zzryec=7yiteQfuOhYXmJ%O?fc#f(?<dzNP>IU`;^jYflBY#ec4?5Hr$ZedOQa4kOt zB;hV=rsvbz!LeoZ;@q{-0NaO3*O<%F<o}oB_-BN=a0`Uf%due(yIgwq?DPNVY{0*} zX{@f4wHPwWs=SD0_u!{hG*y&SXK)m`DI6xj&%X+JC5P~bzP)4pc`IW~D$D!Tazp|h z#`eej)6K<2aSk2od(9?8V%sxmhfKIqV@&#NdS{GpIX7;&J_yNklOwab#8`Y^Y1Z@V zmuR2DA5(8cEyT*fIY77q&w-So#v0xTwh0obBP<)pbpkB`xNNv(F48G<onBl+cI~7F z9ldxkeqxZRwDjk9MjB&P!!A5hKg5LBZXBuYBl5QnrTBjPe!{JBP(#Yb$?~aM>-qQY zKyH=QfSlBOUniZdFMc>?{$u7c<;V@ygMU4m^lVcX%ull>AGz24cKPn1%SXT8F&KTJ z^3%K6_$6^{TZi+jzPqz5YC_O8qOl3rq=rBsQnsMVMPkk2S5Qvge3Z&Eo8Nuej1=`m z$6Yk{i6%XFnvNgIi^qJG5np$1VMD*URgTY}^@rZzcpqEpMYm0EmTr}d6{!8)!u0`Q zdv;wV>-oFudLwzd4f0>sHzbX1H&)#H*DX6#lYKAQ2rJ(gda*a6;;K2L>z>ZE)+CT` zvMg}C!F&gXWD1ZbLRZ{-gkMu==F3)8{^((`60{U}K<;sQj)9A+QNzWB>W+;@m>;wx zPq8zG^tTcp^Hm&+Er$MP1-`k<<5_4iKDA!=J<`{~>lWIuNq$ZbcosK2$sUWg@-N6T zH&5nmKQ9^lg<DVq9nZ@(=_YG?=H1Jsi6Y@)-ruw<rB<<i+g}|06pktbAwi#{MA%B= z=}gn`SnDvmW6oPP0g@4sa#HVKT4O6Y=*{>vAp;4Qum0V6h4_PSf1MOy1Hp5>tN?ms zSLUN|(F(~l6`%0wcqUL3;UZ>;@@dRPJg)U`0xdw7+$lHyLy!9JKfEJX8BP<ta6Xn+ z@NF0onst|5vj0iUhP9ww(N03i)7o>S0szVvl61FdmPlR{Pn7pY6qYArj$dO8v8Sc~ zO>u`=>~C?#Bl|%G^s}-02rE3^dqK8FS3=8bjb9-;-lH^cwDyhui88-U$2sNCY6UO9 zzBHKPS0Qyh{_W_Bq{M~v{QS|3Hbb~FY4^fkO9})(!Mi9*+h_`;r>75O{9NlUy?zyk z|3!wgUB0q-3R1IfdPYYdtfpNG7V11Gh80p^lkYO6_`1X5?({a7K?byS4z!g%G4Yv; z?C8!n`xZ7Dzb7gcdA{i^fuXjApS@o6cvn~`%;x^=V-HqO<TgoZ=DgUtY>`4aNJF!E z$LiV1<D)Vk<v1j6)T$qE1Cc%W!U~8hcqc<x1p^82Cm>D<m24zRSWpfib64Snz3<w@ zvCm>LluP!x?+k5i?VN-RcU~JRu>H!bVrMBB?pWOXlhN%ci6NxM_I@vR5-ym@0wJw~ zpvv#}G*=!B8d`oSRgx}^U|5swNy~jTeE%$`U;N5Ed0@%U(zQuVR-^BxDKgfEa<|nh z=vqqqFO`;`io^_XCml;!6uD|N8>vSB5jG>;1UwCC10M%z7T?42OQW_u0xZS+Ld~VW zSRDV5H_m1*?yMRtgrk-_Rpiy6W6_xvLNR6EzulRZOC>KIbIY?7xm-Rtz2qNYz3}yH zgZQVP{>Gt9>1VVa>+u|+`*4gqo|SCVwBnXL-O9-qxN+RGz&-`#z6qWa4^oZZe1%sM zTz?<w92`BuwD`WDk-M#)AA&>-z)1zKYWg^wXcLbIxt#d)ZD8#_Ny!2EHt1J=dF-Gp z;+_1rrQQel%hXgee(XFdfx3N??9q4t)`%WpPDcmG-0!*4jpP&+)p9sTt`$`*W6t`@ zD6Mwa!%OzRUr||-rtP<=i)8HN9%j>G^Oc|k#=K*{G!4D)ve*s20T-tPD$$P=)o@Vp zIO?#1#P}Jmv@4O~<yy*>&kgC!P3apnPn`TqYhse3^lp=jFVTqqrU3;nmiN`PLfZ+O z%bz?XPd;)hv+9^k+w|qCP8^$+=8k7hZ9!NqoXBa`F|*3O6iIF5)EoU_^3BfIM%G(T z8Z%M1a)5Y)ulif7b4#Dw&obG1)Yn-SYhIK2hUSD81)dWMcHshf4G++~Wb8<*V767H znDo1={Wn;sLWS=dJ!3m-jU8}2sT3pTY-*EaB4UA^t3++z@Y)Cz$N#D6IHAg=2JtJ} zxVh3j^LsPea{F*WrKPudR{T*>o=v606eL%NYhCAFq-;ljuu#9ttrHy-l&kzWzuR+S zz9z%ujQICS^mO~hUR_V;n4B{+h22KG1Lkuzs;QQ|$+dVw`g!(|oRAmsHBBN^ml4oI zzMsS~H&7wWm?D>Un);2N50os4IbP(y;=*_+^@XIeS#mgPkqdYg`lAICq!dPOl1%Ea z1=6`!JMY|}9Y-$mKYMTd&G8b4x^IqTmstF1G?hf%<jllxzHaxIT~4<WJwHq&?C`y} z3S_jGHU2!+GB}rTEq$<6yw=Hl+eB5})2{iN-^1cB+VDvWuKELF<@Bf9?RY4+QgY2@ zQm6cDQ{BwTA^&3ryJzvP0B?XoVl1vnF@0W@g4-hJ#V6ilah|#?<`_lw3)e5!MM)3W z>$%LQchV<YQ$L1K#?uKTvrwt2?VpBZ^mCm~bQyOqyUF8P5?U=w67xgHBF=&2O3;n= zbOo7LPt*7G$o*Q3|H=O_9g_$^ax7}@o*vSULSg89Jir_VLHnGPo46ON`;z}(vcNuj zHH=HD{;1d{Am-3*mk!VgfJz&rN~gS+xpduU2qfjOKmBmNc@e)PllO?S>P%BxOIX8b zPn3qCb#!p_CCB0?8_Rzrn&50xleF3nci@(Y0ENaq%{C^q-VyW{oFgRFEr6{epO>-? z3P%?+BjIM>pNIDcvukkur-Bxte6|jUs__jz33oD!0O`(={w~2Rs;0}gsp+FSi?Z6w z_Txk@R2)8qDT9~?d``Bu@K(Wz7ICm&m7J&M=4SAd%$w3$*G}<=rj?SKk7N}WwoAS) zyleL*X%!9NyPmfHM8fE-{gvPN*bEJ#q}M73r7M*l$}BGbGHveEBCFY4jJ9hXbwCgO z=DFw#z`v}m;i5*<3rX!TAlQvp8ke#?K?(A~!xE+=v;Qx%g0AYmlK!04|DdE9z>b3` zvfpS@fnr`5nKWeGt@5v88mfOR-Q5o78l-Rw*^SiOY!ep`UHX~}EN|(R&a>@sEq7jO z=ZBVd+e>+^_;JT(+w6Re8_OV)e(%w<4;RQX!rXrin=gK5Ss^zme~J$O*^QTcCJ$LV z^c=g0XaYgq$g5n$67T==lacMpMT{Z-yKRGM60@NkCqVpemkeldT@1PXgal&;RTYJD z9KL`H?P;OZIwD4-NK)iR`r3bah8p;gnk4?{d+X6?P*o)B(GQ#u>?}q79VG!{Qh8~A zu{2ndK*=sMhpyf;;NR0v1~h5?AXB!HpcQn@?X|{x=h3kJz4mK$6I)5<#eDqaUG>oC z!7RodJHNM4TCLe+cv0p5HAn0pj}wS40~83}oeJpT^;&HP$@}DU+3N4caAb6#?*;m6 zrl#x*q^!yL9?4)KCt^yVFir_K)(9NzdqqIIm0x_Mv9Yn}i^n|BAIhC%J%<6>Hyfyo zA}MBhDu@5^4IwcB*Op2GUq3xF3)iQ%c^HG8wRo5$V-{+>@FtMc^bbJamU<iRCqsHu zSxQnyru%I?2v$nol{2=7%P);Ph-q#A8-fxH?wLKiX3qSH949qmjfxLt#b8@*q8PFA zmxGJW1G6e?;~q;t#_8N9cJn6D&Ovlz1F3ocr3FY)BkZ`y7oW|aG5evI&gM^%s?+9s z5$DetW8J2I4t?7|Bqvra_$5WUzPz(-*G{`j;;6#U_0Kd4wF|duM^;w0*!}r7%%0le zrtg^+-?dA5nq)k>K-a-yh;BK>74LkNSHP_~@%_^#p{UrIdgDWQC3*YqsB+bJbteWT z99f1()$M-pz8KiBt8V(~Z}uf(iIV-Inb?Hc@^N>@`!8>tnW0H3Ec&91(I#FiACt<% z1FN5Gh4tZC$PqUDQJ3k3FNGz_qbQHPdp&WdB(x@<?c&l07iqm`3ZKe(7#ISKFDxSJ z59}(AaQYh)DgJq!#yL%<Zsq;~U;6XZ4dVCWP>bRrarZ-P9e#>vo1K>ASUemzi)_%9 zZ5E2@Kn*RtaZ0u038mA%e_4Kd3U$?C95u(#%4Y1u7XPerbp8>I;KGDy{$101-<nR5 zU5Z>h%}_M+jw(*D(KBq3(IB;9+&2l+<W$}2TAPduwVAUO9Z6*HvXrJy{vMMP#&czj zI%@Cw8{PIL^1_r;)F1it+_7urEfuq(l=3y%+-_^ybvZ+vj)8On0>=ew@klI4_8=(3 zs<av~+{MBul_8%(pgoyVoJrxQBj!q!qNe>=8xaov*EHdcPTF_BI%|K|J=}ihk#7b~ z+9{Kz@91$PJ=XGdb~o<X@snOvvrArIj*N(oaKE&z*9-SI@!+cE9qMk4kazNB%Zh0= zYf|_flYHjY6SrrDesUg4Gk(>V-}Jk@26@QOde6Z!7aWl4FA)t_lzt0vQ9P=3?dCOk zIa3Q^aa-d4i7NyHjCeo-%xTJ<luRaaP%)RH%vL(>v%bL%OJbg`1AMxS&`8h&7S6YP zhxm_sUI<m9f_s9C15LUoG~gd|o$P;TY$PcmAdfR5b}g|RBXj`UB5lYaggueJXUa=X zK-&N$danZuh)B}{yE$UKxTGzP9<7^nP?Awn;b{Yg-<{bjv$K<$Zzvnzf_5Xn9X;f+ zWr5{X{~0hpUg|mOP@GO@Yj&y)mshOx^vUgIjd+J^{?CH0UVJQ~-aKu?TlTTSAlmL+ zQMDP<+VRZV=Y9otYw=aX9LpPf)`ImPz2cECGLa|N=nUx~?111lSUX_X3@cNG!gkH6 zOHpSu-}#Y>Qop!PQ-0~>;eay?4Vn!f63w$INqZ~r#th3*u=4Iy1V6HW=)~ji51n~O z+qTem^2ezOvGtEWU9WzwZYJFAFtT$$edkbn?^)ECCu1*LR$jpK`B6*FF%-O25cIo| zCq>nb)w%V=`T8CtbS0!Zfi6i1{DNR7Qvwv@@bRY52d6dq^!ZtIwdn<QTyLGXaEBBU zOU3a_XD*Sj*xMb{yiFR$_lW<Y(A7Lt@XmR>`}qCHTOw-ELAi8NrCFcj<)Z8kX*5eB z$46dPzubDV(O05|Tz~x8p6AG@SXsQ&uYw!*tphISJjj1sT=9yi6GE!(bWPjEbi5~i z%pa10Y(EV%^9q72R>Hu532I6oHhxTt{#s&7BQnaIFWi^HFtxPdOEtx%5Mw@EVS0El zhVOwH#pP>u%aUtBhtGOnIMxAhueOfm>x+sHY+Vg8{KD5&r{-6h9`Waab7}n_+T$Nz zB%P9tG`D)md9JCc&`s8)_xF9`Zp}u8^R{0ul2p9@o9v6_`H_s&G#aQRr5eB2h?tPt zfZ+mKwQBH{PQF-XJ4>dtOBc<O?K;gbv=o?^YzR>oU9lbTG)f)DoPF_FvMz&FasFeo z`WS$NV}r&xf0m4i7@tvp9eY%r>0;qm8z1xF-|HJg&KG0NB-ur6I?8N5Fd1t-(}|}$ z|6TEdTOLo`@+;uYhcEvJ&gUlwA}Ck;+nbiWCNEP%Y%D%8bV;M&cY9vF21%0dElTK{ zA`Ixv#t`Ipk*>^0P=+JLrRdF4!$#sYUGI(psU1gdzeKZu`@mraho6w&9ZVn5S~Ax< zc9z@m&i@Z)+domkZ_wtT<9s`)6HxkE{Kgls@>*D=HOd4{(zll{gp>Y{6BJN7Ey4_# zO2vv!R#Xh>n$r9s9YRc}4D<yHO!A+e9K>q!yS0&;O|?axagxV<t*rS-^=7&68m!Yh zSRKyMP%y1KAUvmZhL=^3erCkxz461lRYQxp@8vc&LOC5K?isp%QCVNTy`^j3tU0<- zv~Hg>?vmN`^GX2G34{INH+SY2Qd>NAJ^ylZLzAzPVMyeZ_YPJE!m|2aSmXQouW(6& zBpIx?Ts*df*7f5EZ3)HwB9|2jn(v{3t6rq6YCRG_zm{vE^%vI=GBO7MzP~Ie?B@s# zj^_w1dP)UXDd0TDU}fiN2Y_2xn+OLLmj9bGeeakS*=xAU-}OFP!|Jrl*~k$P?rw<T z);-}%lxPfysfxv55ML#1HZhTntSboW*3^<0ByCVT!w?;QFRm=dqO?~iJc=(Q2Stw- zx*~s0MFZ1wzSwSifmG&{(dr|+#o%}LbJP)n@g*Y#QtYVo%cUdgCoeflL>DB!qYlq3 z;5UyuUe_(_H0FrjP^ECD7>~!_q9ysLGesR1ytcj?du>o~MNQSgN72&5Aaw5}n;JW` z#1wNb?DKWEPC=fJTt9!_em@ugvWGht+<}&2^@kP-Ydkwr$QXiQBE$DGd9aZ>dbM1U zTqD&@ZE#!3DexX^(iC_&`<IU|h+5bA4;fnwvT41&Fx9R9n5Q^6j=A}e^r@><n<Hm( zB8M>ZpojSQZ{KltZHh)VyR@(A+3#W)&+(g{;dOkC8R1EuLtEBGK2bA0EP~dGba>=m zz|c}29evqB{>Brz+~y~so1P-q35u-j0lGt=OCI6M%xDW5p0qF0q`zMNoKo{H^VWN2 z=Z_Z2b|`_&4;!#zK@2NAfib7T#}62Bn6u0Zg`OzsAI_$8WlEK&5uga+yJ9N8Mtj*K zQO2&p={);iI@)CtpTS4U+~3jq88L{|Ih)8{otT?N7o}o`X#PHW&yjV7emSNp@F({h zYI<?ywba|E!|1(KE|gg=c!}~3Tfv+U3i!=Ne@}nKIt-NXR%|HswkbZYb=yoBwz^(v z@llA08-fZGSBNVtMFsF7wYx9bGtgbkzjxM8@;n_rnu%eB{^@<P<PXQ`1$X2OPe$bB z9*Et;1vnZ>8ApeS5IZ{TQ#SbY<T#h;BJ#br3)|t&na7)_b_W1eo}<WIQ46?nMW+1k z8yda0rdp0q$Q^u~DSo1%`p^XqUO{W%1f~qNWeV@E(CE4(R%q4p#il{Cgt0)3kwPS` zg^x<!gm3Fd?4s}F<SBnFDfi{^s!Lg%PhUZ1_jD!(-ixYqly5t%Z)NiS@D1ww^bw|X zXxQpoXg(SN8QhKnlLUv=APCMvQ24kH;`xDNWX5GTR6Xvba9v*_KWfaaK~H+8h~5VG zxnV)M@mpNoBEtKM&70@*A7!s*%)IWHyWYNJTKTr+3x0g{Z+4&;d&{N1^SiUFzhJQE zZhS%$Y72#RFNdd>;M#A$`>LOu^7l3=Xdq6L>-rFi^t%?;`@lb*4io?Ffyc)8Q}<V_ zlbwgMi+Cbl4?N;IvYax$`k{OVPZ&H@pCcFqJ^&A!pO!G}2NUAta*8eAJ>p`&yO_$h z@efl74xnAjZ<2`2Z@MkkZE^8pi+{|dJB&O%wtDRD(CJO%_7NqW7t%c;Zr|?yRmrZl z^33238lv1CxB7z#qT}QVCDxW6+s%pDV(61f8UF0TNSZ}W!P07)<x+NAV>FZ#FV5@F z!;6i)s-DUF?AFQ0BkZwHi!#NM9BL=p&smMsmUG(Me7P_S$}Zq5BPMEBiv|!(7+VMg z!%5qi#i*!}hvif1tPMnxn)#=a=VXLYrt;G}$_+D}#jSup4p#I2q1HC%JY<$DeZt)F z1<6=e<%2Y3xsI3=x6?x>EEP8Mw|3tT{#*Y;zY6>hUYsX1jSv%Qm*-sr)2OQBOw?bb zA<olsax@WqrrDX9r=a*Qg#IDpQA5zqYukAZ68jY}I5wYfZ1rc_^}6><rkz?*S6_I% z<&E$--fPpd+NW}1p>B@2Lix$W6&f_7!eF4V@wUfW2HIEeZt~h+68TNecpd3MdgAMj z>*%waJn?i8k4IpYXFAW7J9*EKf0nnn|5jRPV>NdsFqboAQ0?8i+49R;9P|DZ7B!Mg zcBcTm<pi#K{z-F*D@0h>a^i0eUkH6E#aZ9jC_#%7hHbj17s_p%jsZ!i?;`n-h4a8& zouU`{7bA27&Wji(f0XFoH1zgK={x%7g?sCI$n*VgV0jb0h<j{Ig)s%OADL$Iy9s@U zvq5f-PIQbq?WRmw56*@n)_0~muKD;YKWIWh36@`sFPe|NPT{@6@%&w^5!aE5=z?gb zwNd8>^J%@3ovzhpSJg+aiKV!8z2TL3xEFK+l{f4LL{kIkrvTUz$Pq8<5PM8G(|piT zfu#f8paJ(o-O}qw&D*zZH&DH_3FAoYm`Vn{Ze8vAkr<=G!ZD4otFcFtMU9h$WBL<L zxmn6}<SYI7Oczr`FHnj8XIg?IyDJ9>3}ja7bob>`wuRyU`q*9ksj2<8?QPgw5iU-T zFMReMbXyzO@E+`H(Aw+e$@0;0U&{+Y?eq=Gb6FPXP<wZdn$P%xG&yM}(dr@pGNvUf zo9Tcvw>plLJuff1n}1UL_^EEiksI7Hhlr{$_$)rdz>m15@GJphy=Wj+(B@d`d($jR z5yAT*WfXtvXHZWAI?e)P=Jj><Osg}(!IL-Ao)$fN7JNzU=g+G99#hZp;(99S&H_)h zKRi<9DmZUDl(5OI7u(ism?UVh`%e%GmftXmH&8;7=(i<9LH(v1Zn(swB#ge)oV-{$ z8=vW6BB}BjsO{eTL5cx_D4-|mo00ONsYpRv9xm_;!Zn{qw);K=j5XGX`*Y$dt-`xt z01vx+`R4(@1^m7L`}_a9KL02BkOK5WQD3rd5h-XyUv#E%o*j<6z!%nV`OGUz@B>Un z`?tlA{-199|4D5l2*3hhG=Q3^83wL%1s?K0yM2o=8t@;w(?nkV|8^J5JZR*TKgCr- zevj%Y@`zRdgzt3=$OV!POlyQNEz%c%>KsTYbDK!*TyI!iZ`_j)_ztgaYu+R=;u64f zLpMrp<yVysVYAI85trF{i*UOKJOrIhngBn7cMfa7OpBG=sCaefkjjPgq$K!#uC#j8 zm-Lz769KouuOpG#%71*Dfu}I;U;&ypPXVrfg0K1*x1AH$!4Jf>mqe4k_)!<B&CjI6 zPo|wC92$p*hHo#8KlY=RCOiPPOa0Y1EjY6So)<g@bSN0><7n#((ex$o0ZX{vTxmjm zCJvOaKwt#bd9VDYx*YVGYM}V1<4sJmdpG;kCD0kL5NEYN-01K{7w+MV5?TM;R<I$2 ztGEi>xx1!=d#}wexSKNN!Oe*J*zxR}mMRbNRz<nb$CCHf6x=I`MoKM@8D`Rlhzt6? zp=Ausn9GQ#TlFR0j!%F6ta|$}>}w*f1%X_BA`kvI9a1mbydaY6@cw(XGU=6=Efu}q zT}-4`fin8gyz>D3dT-ckGC{tH*?ap&17RqT4I37b;hvg_^*<UNbQ_+M`2Ae6t3iUv z6RvujfH5%xA{oLvNP&E@ZV^Y3)R1-0ec{liyuV^J@m8o{HG?M!KIq_a|L2C#NWv1H zaPj``tWyF%5hlj~@zImMSRMn^xIm85$B@dX=m^-&Y+v<vdA%1C$BO2E@Ber}=-BQ< z!!QY>n@Se-ROyvB`eg;0m-a|<ZE)r9^zL0F@TP#VZh&=TAuVZ06wbxg&EzlIO(*zC zf|G=B^;h5Y)$iGTVE7*%Lo=6iL|#x<o7f=U2QAE&{&n5GZ%_&Wb`X4iN6()Ab`hKR z#YpX@zaIX%)_laf>#JWs>)qJjaegp5n8UB>$Y}COo)4Sh+?O{oH}fry5?{;D43<K> zVQxVrSTmVC#fnt$uoL4}h2Ic2?{BWdZC4Wk7ZI+S!fTv|M0TGV0fT`kno2e-;>gq# z87Y}d0<8R}l&FZemU#b}HHCK)=8%6=$nDJ2jX2394b4T!|3_gH%4d%aOD>F^x>g|F z1|$M_2Bs>)B92J~lYZhyM!aqLvvGY*(wb*)3i!IAHyMsZdfL0&Csd0T(IF{FWrHcc zz{{(v>Ove3<XzDeDF_C%_ilnX$SZBf@|!J^DBh2xv)OyG?U4CQlFIJT2f-2o6{7yn z$IJFtyz-9N@f<%sFG$+DFJ+8|eex{cA6nnNeRtF(n2m~;k7800UTY`nr95l6)r^j< z^6jt82rq}=rGMWKNW~)fbUZs^cib8OG4Ars@qI}HlOIHoG;!R8w2Y%osOmjIyXN`g zbuP#5TSs01$&MzG+}U}`>n*ZE7CAxU!BW7ZW@T`Sevkfqx#?*4#LfQp7z)rg=Akv4 zLbbmw03=WPzCG!j`^(2h@BN;T{11+A&qH6oIIf{-3k4O?@y<WG5M2`jlL&lax`(v( zMEb6%Cehfai@id_<-^H^s9ao2EbrdE6T-iEZg2w5bt3R4AV{=U!`j$o63Q!z8dUOw zt?8i|$4<r573vbj3HC&K?R2@piC?>qj1c6*?!xnGP1P9I`@Zt9Uz5!F93o8o!s0+t zYs4M}fZJis@Y{|=v<6$glyGcWQryAz``@&z_NV}#?{lJ)iZ=-s&@jyap~8noHmvRR zkxGnKHc-kB+F3MEzH{tY94{C&a0>;U6A0IuSzS|zAc$7O5B(Qo2PyrFu`kcdZ4wz9 zmMeVp$oh>jhWgv2r-P9pF^7jmT>d;Qrs18x*dm^|Cqn~!ez@dYjR_KYqyg+R5H#`g zQ-Nt3Oi2v$)*G&Ck_@$b0<XSEX+W7ML5DRcAq+eLi*q7+PdM6{odhSie_Jl`d-|IO z5XX+?w!W1sQDH({)PD`1+N}S2S{*g-{_@y<9vIU444xxQ6VN3^J**c~KjS1F|F)L6 z3iy(6ok<(zA*#p!<8|nNy{`G^zg`DVi=dcLY1mP}EdHkTWseZg-Uz(4N9Mz3@O@eh zI^{bLC?ZTN4NIVJwW?}YR>!wq5iM$nCxu=kJtKYZ*a1&S!i2Sx*L+MQJbJ1nJ%oZ{ zVe)HJ8t>B$cNQb!sIeKJXc%Yj?>!X^f2XNrJE)9;XPobKR;iM|B6B$SOTu-xAJGs` z@z+oq{0UwRz)fH;8}wUAg>rL$y8o8<b%F^cdm9kS>*Qh7N#b*ORMvaI9x&bf`>|#w zRXN5f_ZEDJvp2I9dLptlGGDce_zd)UPHt296@S~V*c%LH0^cHQNJ!J9HwdFQ7Jk;f z>O{d}TgS%x!A7CYpKp)bl{gCrlZjs%=>`umX*ZbD2}ILp>hmWDhD_aXq7ZMGmx!Tz zy(6$0yl0u_=5}^lJfA00+X#``=GDt6#PO#Lz6;kXG)4Z5(YGNEuHJ^1W@Wtor~#04 zM5=%}=6JeX8sAlZ4bp=?R7Y^@8Mo<vY?UMzpq}nMCU_$h`D#xh!i+45Cc$j&2;HDf z5n}E>>O)13!RLQ%nyR}~EwH!fvp!BPcva$;;E}=4=ym9G*D@(-GtLXqZ&4L-s%?=S zmy6mvyhdtcVr0s5;8r1Ebg=ddw4nz5g0f>g=<iR!XEOQfmX^j3OPGX;5Qo-v&e+&W z#XubV5j-*os0ThL^W7*6*&3Jzr|8ih?M5Nt+W{9M==wxXdPg53K4*F&HLLhpP;?X^ zLwF@LXs{T--kFf7ekCiTWH65r-*}+#`4BQjMm`y;L8>WJbBU;>*qi5`3HEI^t+fUc z-{aof{iiS>utxCk?g&OS2!pO)^Er>oGNs%u7&dsPEck$xSGx0Vah*Q#Dcf_a&CSuK z$$Li_EL@nh8jfpoP?Ma!gFPZBY5O%2h?kz#0B*I3W;)e2v3<4Vh|8_G<>mwXQ-+^~ zz#g`c2uKE#3W?#P$mr;=Kg0LF9^>VWPjXZ>+gsj0pSp*(oOT2`cb8WROqmI!O+uo% zij)sAbVB`SKMo(3e3g{={ub5XY0R^{4UO1^vK!}<hQD=Y`49;e%j&ESpvA>`_67he z*BBt;j;prmS80%3&=)+7`P2SQ>#&6DsjNLFC$CCc{6ce|=yQU_0${+dd{<$xO{WJj zw8~Law<ufQw7y|id&{Ff@lEUX{$ZRZy)2BYP<nh>MF8mDgk1*w%MYfk-!$>3OJMvn zUpNUJ8d*&x{e0p1BEM*0uE8K;&pm4!`RmU$t97p=K$h@6gVh3$)?4a)O0{*+X*Luf zr4b~ZXOc}%Ra5YP$D!V_8SjnRJ1F{}uWW4h$)`CI_ZAQ&L_zu@!F7j8;Gt#(7wV6+ z|JgD+;1MKTl`ff)uLXwh5rxw3f%mo~Il?^cmj+p>(*4=1Yb6UwjOxVu-A#j{c#`&B zu0c}|s2%g5fi2dUKlbffoeY^y{yc5)y^6`$yg|MerRAH&f~qqfJFCE`AzWNJhIHFx z<Nka8kr8-VA*}}1?!QN`@I}#VG1LHo>#(^#ZLj>EE-QuZ?Vj-Dyl{^vkGPufF!?|M z6HxR8d74NE(&L4!dDUc>nr;qJFYTRbb(XBEr>((PVJ0JJa?q27jKOBc$BD=#yEbBO z7{v8kTJ<zhrTo`zpQ#A9-Pt?16{oKH?Hv(=;PV);sH+RKdVdbt;u$T;4%)`jX{GW` z=SvbN+HZ1#&VYF0b!#xdoZ5hg4p(AGgx1oSc^+a&B+`z`mrqwQ8yzw<mwPwmto}i+ z?SW(JUZ@MQtQ!5nbLv9!#O|>SkBtva+EBq^w(?0I!%chAIl`K{@A1+TyFJFX&8>2t zTlgk;b8phSY?h}*B1&?$Bp#_50_kebGkHy|HAYhB{0_MPd&`tK+(3n7ba&GoN8$+p z_)HSg?oMtwP5E#Ndruq;_sEgx#M78Q`2~^6i7yiV4^Mv>OtLbJC9;^UUeJnr&Bu{i zWkI6S3LEBtVd}|s&T2}>pM5wA(GzI4)cVd>#3t*-t<k-W((4c$nR=rCa(C3j{0vwK zB5k;gVLnNZh&xPo$o(wSohWQ8|Dyq8cbSE;Z%ul=HSwR#Y3itm=QqAM-u2j@xpKVW zDskrE9j1_W18cCZqJSxh&H?lxQ<t7QQ0S&iHRWi>fT#bO-MNbARrxn7_l#8Cm+E~t z&(3PC?%MWXwd;Y1s?VM2IDG(Z9vXdo>a?Na)MtpAdU#v;-601qULh{$?baJtfn*|F zSo2lE$=5^qPl5$ungK*N!Vh+giLBuPZCoa4POj#wYl{?#)yLevhtVYrK2&Xc`G)u? zJ~<#0bvY(g5G*GA9N1~tq}Dp2aaWt4)LO*xov_B*fRDWYS^Nf3Fk%lq8#^i$ndHCw zslgWv7<ke0O(^YOYabRc7S>?)$|jf5we?o6Oc+}l*J)Ce_`H$INBrWO>*l>Lu03n! z&2`&-0obj2KH#@spg7HkIAC4U^F$~St91VeUrFL0uHnuHY2!^!Icn>5Z}ct5i2H`W z>$6gP$wx!mX!jMcJA@xiTCY^k%qZFLqr>*A;4t;2Y?jJJei>TtUguXlytK~?f2`>9 zIK7tM8%WS(d((2QgX{HE+G51lz$*`Ayad_dEBf`?#-<Ga&rE?`wT&T+GTh(iHK&|A z`r+Y%p!r|++ds*6h6culN3wsjXWbSN1eR)`0&^iK?pO}4*OL<MT`o7vgR}5uOHh(V z<G~HlhhEPXx63KGyY>vjq2ExC9Jskp<!kLPi`ov=Nq^wM0ZzQrf%RGflVHRlA-{+^ z2ZqFl=NzrgS3W$fy!Gp(>*9~Q4*->ez?`sqQ9f&9L<FJr6u5k1K45i3D(rcJ;z6dG zvgZrln*lYZfB%=H9=W&)YW10r<;rE*A3dOhKEQ$noa(HS^;Hs*w4O<Dwy<!gaNhCE z_`T-wVgIb^`6|UXo}Pl($-r>#``XLS*T1THf=X9VDF?C^SkC<VuiWt7(}6dLL+ONS z$}y+;u@9Y%8KL#sf%0d68^e2ZZylc`1J%Ze+|YjFP-EfL0JWmRzv4z1v~UEqZ4?9! z9Qf*==qhcqEa0Ku@q|O|$2k<BYWHnAe{NA!Q#<!6SRn#wvQBT3Qn{eSaMi+riI<h{ zhh&+m%3DtPNvm?F2s?baza6UEBO~tM;i3!5f*aww8ytWY=Hv$EI|_}n<~>{5=qzRP z!T61r$1PzypS;`Wms+g~Tw8x1mKu}4OIyeE&2WGg0pKbE7#6D@*XsKuaIJjeBjAx% zViJA0y}xItmgh<bsJ$^)OWWU`d*lcj`T{2&Xc$@@;tHDBpepmhl3PU}P36sQVB|Hw zVqJ8d+vWFOXt{HMQTybIjfX{k1bLc4bVCX~mV=Xleh#>t%-3nMpyAbIN!i(JJ}lf} z7q(mQh=?Q9;+o2hhqrCgP&x_mFL1sU7`iM6UmuvJb2sdb3k$Pxaw*%o#{TKzb~Y)$ zSq#G`Pr08DP4ER5!rxpt!YA$p?;U{ZL)U{=&77Pw4yXi8aPpAYz;H*^^uzP%T=H^Z zS*NWVBBs~D!YZM@^o9EygPx*|9W$W5230Pg?!_S;V7~7<F38I&m2lnZ)@%-WyP{Ts zv&zuK^PzL<62CVA#b1p6I8Vxf=mjTQ0oQ~2tn8(YEwc`!EKOi!=jCMA*>Xl@_M6J@ zzgqa&SC?yho)U9D^VjMxsM!ky2h@8-EzZ2uE~?n`>G`BRKoM}s2Wn8b9^_vr;IvDH zYhliz0|JY@<dj4m+VAO}dvNykWTl!1soYBQBp$u^{=zms4QvzxL;MU`lO>PaZauG^ z`&7$*3bYmj1u1A;?N5E_^}NPQfx8Yz{5WuvO9iUwo~2oUswBi>LUSw^LCq*0mW9cG zo%N45hkdvLj5IKqyb4-7gYpo*L3%pLXB+$ncApt{db&7<U`{9<TPF+Z^C|FD{lD_8 tpjoB^)(ASV96Dw|C?H1VX&TSW3_qV|EIB7F0*pik22WQ%mvv4FO#sqtMo$0$ literal 0 HcmV?d00001 diff --git a/src/components/modals/DeleteUserModal.vue b/src/components/modals/DeleteUserModal.vue index 3a3acaf..b327b23 100644 --- a/src/components/modals/DeleteUserModal.vue +++ b/src/components/modals/DeleteUserModal.vue @@ -15,6 +15,7 @@ const confirmDelete = ref<string>(""); const emit = defineEmits<{ (e: "confirm-delete", uid: string): void; }>(); +const textInputElement = ref<HTMLInputElement | undefined>(undefined); const userRepository = useUserStore(); const settings = useSettingsStore(); @@ -26,6 +27,10 @@ function modalClosed() { confirmDelete.value = ""; } +function modalShown() { + textInputElement.value?.focus(); +} + function deleteUser() { emit("confirm-delete", props.user.uid); deleteModal?.hide(); @@ -38,7 +43,7 @@ const confirmDeleteString = computed<string>( .replace(/([a-z])([A-Z])/g, "$1-$2") .replace(/[\s_]+/g, "-") .toLowerCase() + - "_" + + "/" + randomIDSuffix, ); @@ -57,7 +62,7 @@ onMounted(() => { :static-backdrop="true" size-modifier-modal="lg" modal-label="Confirm Delete User Modal" - v-on="{ 'hidden.bs.modal': modalClosed }" + v-on="{ 'hidden.bs.modal': modalClosed, 'shown.bs.modal': modalShown }" > <template #header>Are you absolutely sure?</template> <template #body> @@ -78,7 +83,7 @@ onMounted(() => { </div> <p> Enter the following to confirm: <br /><code - class="rounded p-1" + class="rounded p-1 user-select-none" :class="{ 'bg-light': settings.lightThemeActive, 'text-bg-secondary': !settings.lightThemeActive, @@ -87,7 +92,12 @@ onMounted(() => { > </p> <div> - <input v-model="confirmDelete" type="text" class="form-control" /> + <input + ref="textInputElement" + v-model="confirmDelete" + type="text" + class="form-control" + /> </div> </template> <template #footer> diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue index cf841ae..60a8e5e 100644 --- a/src/views/LoginView.vue +++ b/src/views/LoginView.vue @@ -100,8 +100,8 @@ onMounted(() => { ><span class="clowm-red fw-bold">W</span ><span class="clowm-green fw-bold">M</span> with LifeScience </p> - <div> - <a :href="loginPath(OidcProvider.LIFESCIENCE_AAI)" class="my-2"> + <div class="my-2"> + <a :href="loginPath(OidcProvider.LIFESCIENCE_AAI)"> <img src="/src/assets/images/ls-login.png" alt="[LS Login]" @@ -110,12 +110,14 @@ onMounted(() => { /> </a> </div> - <div> - <a - :href="loginPath(OidcProvider.NFDI_AAI)" - class="my-2 btn btn-lg btn-primary" - > - NFDI AAI + <div class="my-2"> + <a :href="loginPath(OidcProvider.NFDI_AAI)"> + <img + src="/src/assets/images/nfdi-aai.png" + alt="[NFDi AAI]" + class="img-fluid" + style="max-height: 90px" + /> </a> </div> <div v-if="invitationToken == undefined" class="mt-2"> diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue index 4a3295c..0fb0a46 100644 --- a/src/views/user/ProfileView.vue +++ b/src/views/user/ProfileView.vue @@ -48,21 +48,135 @@ onMounted(() => { <div class="row border-bottom mb-4"> <h2 class="mb-2">My Profile</h2> </div> - <div class="row border-bottom mb-4"> - <h3 class="mb-2 text-danger">Delete my profile</h3> + <div class="px-1"> + <div class="row border-bottom mb-2"> + <h3>My roles</h3> + </div> + <p> + CloWM uses + <a href="https://en.wikipedia.org/wiki/Role-based_access_control" + >role-based access control (RBAC)</a + > + to authorize each request from a user. For each role that a user has, he + is allowed to do certain actions on the platform.<br /> + Write an email to + <a href="mailto:support@clowm.bi.denbi.de">support@clowm.bi.denbi.de</a> + to request additional roles. + </p> + <div>Your roles:</div> + <div class="ms-3"> + <div class="form-check"> + <input + id="profile-user-role-checkbox" + class="form-check-input" + type="checkbox" + disabled + checked + /> + <label + class="form-check-label opacity-100" + for="profile-user-role-checkbox" + > + <b>Base User</b>: Upload & download data to your bucket and start + workflow executions. + </label> + </div> + <div class="form-check"> + <input + id="profile-user-role-checkbox" + class="form-check-input" + type="checkbox" + disabled + :checked="userRepository.normalUser" + /> + <label + class="form-check-label opacity-100" + for="profile-user-role-checkbox" + > + <b>Verified User</b>: Create additional buckets with increased quotas + and share them with other users. + </label> + </div> + <div class="form-check"> + <input + id="profile-user-role-checkbox" + class="form-check-input" + type="checkbox" + disabled + :checked="userRepository.workflowDev" + /> + <label + class="form-check-label opacity-100" + for="profile-user-role-checkbox" + > + <b>Workflow Developer</b>: Register workflows, manage them and track + their KPIs + </label> + </div> + <div class="form-check"> + <input + id="profile-user-role-checkbox" + class="form-check-input" + type="checkbox" + disabled + :checked="userRepository.resourceMaintainer" + /> + <label + class="form-check-label opacity-100" + for="profile-user-role-checkbox" + > + <b>Resource Maintainer</b>: Register resources and make them available + to workflow executions + </label> + </div> + <div class="form-check"> + <input + id="profile-user-role-checkbox" + class="form-check-input" + type="checkbox" + disabled + :checked="userRepository.reviewer" + /> + <label + class="form-check-label opacity-100" + for="profile-user-role-checkbox" + > + <b>Reviewer</b>: Review registered workflows and resources before + their publication. + </label> + </div> + <div class="form-check"> + <input + id="profile-user-role-checkbox" + class="form-check-input" + type="checkbox" + disabled + :checked="userRepository.admin" + /> + <label + class="form-check-label opacity-100" + for="profile-user-role-checkbox" + > + <b>Administrator</b>: Administer this CloWM instance. + </label> + </div> + </div> + <div class="row border-bottom mb-2 mt-4"> + <h3 class="text-danger">Delete my account</h3> + </div> + <p> + This action deletes your account and you lose access to everything in + CloWM that is connected to your it. <b>There is no going back.</b> + </p> + <button + role="button" + class="btn btn-danger" + data-bs-toggle="modal" + data-bs-target="#profile-delete-user-modal" + > + Delete account + </button> </div> - <p> - This action deletes your account and you lose access to everything in CloWM - that is connected to your account. <b>There is no going back.</b> - </p> - <button - role="button" - class="btn btn-danger" - data-bs-toggle="modal" - data-bs-target="#profile-delete-user-modal" - > - Delete account - </button> </template> <style scoped></style> -- GitLab From 144b8df8f4d18bf2523e717e2435516005211d2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Mon, 10 Feb 2025 15:07:48 +0000 Subject: [PATCH 04/25] Add account linking to profile page #191 --- src/views/user/ProfileView.vue | 352 ++++++++++++++++++++++----------- 1 file changed, 232 insertions(+), 120 deletions(-) diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue index 0fb0a46..aefd1be 100644 --- a/src/views/user/ProfileView.vue +++ b/src/views/user/ProfileView.vue @@ -5,6 +5,11 @@ import DeleteUserModal from "@/components/modals/DeleteUserModal.vue"; import { environment } from "@/environment.ts"; import { onMounted } from "vue"; import { Toast } from "bootstrap"; +import { + type AuthKickstartAccountConnectionData, + OidcProvider, +} from "@/client/types.gen.ts"; +import { client } from "@/client/client.gen.ts"; const userRepository = useUserStore(); const props = defineProps<{ @@ -21,6 +26,19 @@ function deleteCurrentUser(uid: string) { }); } +function linkAccountPath(provider: OidcProvider): string { + const config: AuthKickstartAccountConnectionData = { + url: "/auth/account/connect/{provider}", + path: { + provider: provider, + }, + }; + return ( + environment.API_BASE_URL + + client.buildUrl<AuthKickstartAccountConnectionData>(config) + ); +} + onMounted(() => { successToast = Toast.getOrCreateInstance("#profile-success-toast"); if (props.linkSuccess) { @@ -35,10 +53,17 @@ onMounted(() => { <template> <bootstrap-toast toast-id="profile-success-toast" color-class="success" - >Success + >Successfully linked your account with a new AAI provider </bootstrap-toast> - <bootstrap-toast toast-id="profile-error-toast" color-class="danger" - >Error: {{ props.linkError }} + <bootstrap-toast toast-id="profile-error-toast" color-class="danger"> + <template #default>Error linking your accounts</template> + <template #body> + <p> + There has been some kind of error during the account linking.<br /> + Please try again later or contact the support. + </p> + <p>Error Code: {{ props.linkError }}</p> + </template> </bootstrap-toast> <delete-user-modal modal-id="profile-delete-user-modal" @@ -49,133 +74,220 @@ onMounted(() => { <h2 class="mb-2">My Profile</h2> </div> <div class="px-1"> - <div class="row border-bottom mb-2"> - <h3>My roles</h3> - </div> - <p> - CloWM uses - <a href="https://en.wikipedia.org/wiki/Role-based_access_control" - >role-based access control (RBAC)</a - > - to authorize each request from a user. For each role that a user has, he - is allowed to do certain actions on the platform.<br /> - Write an email to - <a href="mailto:support@clowm.bi.denbi.de">support@clowm.bi.denbi.de</a> - to request additional roles. - </p> - <div>Your roles:</div> - <div class="ms-3"> - <div class="form-check"> - <input - id="profile-user-role-checkbox" - class="form-check-input" - type="checkbox" - disabled - checked + <div class="d-flex justify-content-start column-gap-4"> + <div class="text-center w-fit"> + <img + v-if="userRepository.user" + :src="userRepository.user.gravatar_url + '?d=mp&s=128'" + class="rounded-circle img-fluid" + height="128" + width="128" + alt="profile picture" /> - <label - class="form-check-label opacity-100" - for="profile-user-role-checkbox" - > - <b>Base User</b>: Upload & download data to your bucket and start - workflow executions. - </label> + <div><a href="https://gravatar.com">Change</a></div> </div> - <div class="form-check"> - <input - id="profile-user-role-checkbox" - class="form-check-input" - type="checkbox" - disabled - :checked="userRepository.normalUser" - /> - <label - class="form-check-label opacity-100" - for="profile-user-role-checkbox" - > - <b>Verified User</b>: Create additional buckets with increased quotas - and share them with other users. - </label> + <div> + Name: {{ userRepository.user?.display_name }}<br /> + Email: {{ userRepository.user?.email }}<br /> + CloWM ID: {{ userRepository.currentUID }}<br /> </div> - <div class="form-check"> - <input - id="profile-user-role-checkbox" - class="form-check-input" - type="checkbox" - disabled - :checked="userRepository.workflowDev" - /> - <label - class="form-check-label opacity-100" - for="profile-user-role-checkbox" - > - <b>Workflow Developer</b>: Register workflows, manage them and track - their KPIs - </label> + </div> + <div> + <div class="row border-bottom mb-2 mt-4"> + <h3>My linked accounts</h3> </div> - <div class="form-check"> - <input - id="profile-user-role-checkbox" - class="form-check-input" - type="checkbox" - disabled - :checked="userRepository.resourceMaintainer" - /> - <label - class="form-check-label opacity-100" - for="profile-user-role-checkbox" - > - <b>Resource Maintainer</b>: Register resources and make them available - to workflow executions - </label> + <div> + <h5> + <a href="https://lifescience-ri.eu/ls-login/">Life Science Login</a> + </h5> + <p> + The Life Science Login enables researchers to use their home + organisation credentials or community or other identities (e.g. + Google, Linkedin, LS ID) to sign in and access data and services they + need. It also allows service providers (both in academia and industry) + to control and manage access rights of their users and create + different access levels for research groups or international projects. + </p> + <div v-if="userRepository.user?.lifescience_id"> + <b>Linked account: </b> + <a href="https://profile.aai.lifescience-ri.eu/profile" + >{{ userRepository.user?.lifescience_id }}@lifescience.eu</a + > + </div> + <div v-else> + <div>Connect with LifeScience</div> + <div class="my-2"> + <a :href="linkAccountPath(OidcProvider.LIFESCIENCE_AAI)"> + <img + src="/src/assets/images/ls-login.png" + alt="[LS Login]" + class="img-fluid" + style="max-height: 60px" + /> + </a> + </div> + </div> </div> - <div class="form-check"> - <input - id="profile-user-role-checkbox" - class="form-check-input" - type="checkbox" - disabled - :checked="userRepository.reviewer" - /> - <label - class="form-check-label opacity-100" - for="profile-user-role-checkbox" - > - <b>Reviewer</b>: Review registered workflows and resources before - their publication. - </label> + <div> + <h5 class="mt-2"> + <a href="https://base4nfdi.de/projects/iam4nfdi">NFDI AAI</a> + </h5> + <p> + By connecting and expanding Identity and Access Management (IAM) + systems, the IAM4NFDI initiative enables researchers across Germany + and worldwide to seamlessly access tools, data, and services within + the National Research Data Infrastructure (NFDI) + </p> + <div v-if="userRepository.user?.nfdi_id"> + <b>Linked account: </b + >{{ userRepository.user?.nfdi_id }}@lifescience.eu + </div> + <div v-else> + <div>Link your account with NFDI AAI</div> + <div class="my-2"> + <a :href="linkAccountPath(OidcProvider.NFDI_AAI)"> + <img + src="/src/assets/images/nfdi-aai.png" + alt="[NFDi AAI]" + class="img-fluid" + style="max-height: 60px" + /> + </a> + </div> + </div> </div> - <div class="form-check"> - <input - id="profile-user-role-checkbox" - class="form-check-input" - type="checkbox" - disabled - :checked="userRepository.admin" - /> - <label - class="form-check-label opacity-100" - for="profile-user-role-checkbox" + </div> + <div> + <div class="row border-bottom mb-2 mt-4"> + <h3>My roles</h3> + </div> + <p> + CloWM uses + <a href="https://en.wikipedia.org/wiki/Role-based_access_control" + >role-based access control (RBAC)</a > - <b>Administrator</b>: Administer this CloWM instance. - </label> + to authorize each request from a user. For each role that a user has, he + is allowed to do certain actions on the platform.<br /> + Write an email to + <a href="mailto:support@clowm.bi.denbi.de">support@clowm.bi.denbi.de</a> + to request additional roles. + </p> + <div>Your roles:</div> + <div class="ms-3"> + <div class="form-check"> + <input + id="profile-user-role-checkbox" + class="form-check-input" + type="checkbox" + disabled + checked + /> + <label + class="form-check-label opacity-100" + for="profile-user-role-checkbox" + > + <b>Base User</b>: Upload & download data to your bucket and start + workflow executions. + </label> + </div> + <div class="form-check"> + <input + id="profile-user-role-checkbox" + class="form-check-input" + type="checkbox" + disabled + :checked="userRepository.normalUser" + /> + <label + class="form-check-label opacity-100" + for="profile-user-role-checkbox" + > + <b>Verified User</b>: Create additional buckets with increased + quotas and share them with other users. + </label> + </div> + <div class="form-check"> + <input + id="profile-user-role-checkbox" + class="form-check-input" + type="checkbox" + disabled + :checked="userRepository.workflowDev" + /> + <label + class="form-check-label opacity-100" + for="profile-user-role-checkbox" + > + <b>Workflow Developer</b>: Register workflows, manage them and track + their KPIs + </label> + </div> + <div class="form-check"> + <input + id="profile-user-role-checkbox" + class="form-check-input" + type="checkbox" + disabled + :checked="userRepository.resourceMaintainer" + /> + <label + class="form-check-label opacity-100" + for="profile-user-role-checkbox" + > + <b>Resource Maintainer</b>: Register resources and make them + available to workflow executions + </label> + </div> + <div class="form-check"> + <input + id="profile-user-role-checkbox" + class="form-check-input" + type="checkbox" + disabled + :checked="userRepository.reviewer" + /> + <label + class="form-check-label opacity-100" + for="profile-user-role-checkbox" + > + <b>Reviewer</b>: Review registered workflows and resources before + their publication. + </label> + </div> + <div class="form-check"> + <input + id="profile-user-role-checkbox" + class="form-check-input" + type="checkbox" + disabled + :checked="userRepository.admin" + /> + <label + class="form-check-label opacity-100" + for="profile-user-role-checkbox" + > + <b>Administrator</b>: Administer this CloWM instance. + </label> + </div> </div> </div> - <div class="row border-bottom mb-2 mt-4"> - <h3 class="text-danger">Delete my account</h3> + <div> + <div class="row border-bottom mb-2 mt-4"> + <h3 class="text-danger">Delete my account</h3> + </div> + <p> + This action deletes your account and you lose access to everything in + CloWM that is connected to your it. <b>There is no going back.</b> + </p> + <button + role="button" + class="btn btn-danger" + data-bs-toggle="modal" + data-bs-target="#profile-delete-user-modal" + > + Delete account + </button> </div> - <p> - This action deletes your account and you lose access to everything in - CloWM that is connected to your it. <b>There is no going back.</b> - </p> - <button - role="button" - class="btn btn-danger" - data-bs-toggle="modal" - data-bs-target="#profile-delete-user-modal" - > - Delete account - </button> </div> </template> -- GitLab From 149c3b03bb83063d0a8003409bfee282955eed6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Mon, 10 Feb 2025 15:37:45 +0000 Subject: [PATCH 05/25] Fix bug when visiting workflow page without specifing version #191 --- src/views/workflows/WorkflowVersionView.vue | 2 +- src/views/workflows/WorkflowView.vue | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/views/workflows/WorkflowVersionView.vue b/src/views/workflows/WorkflowVersionView.vue index 8007ea0..111a142 100644 --- a/src/views/workflows/WorkflowVersionView.vue +++ b/src/views/workflows/WorkflowVersionView.vue @@ -144,7 +144,7 @@ onMounted(() => { ] " :parameter-extension=" - workflowRepository.versionMapping[props.versionId].parameter_extension + workflowRepository.versionMapping[props.versionId]?.parameter_extension " /> </template> diff --git a/src/views/workflows/WorkflowView.vue b/src/views/workflows/WorkflowView.vue index 22ba4c8..4de6049 100644 --- a/src/views/workflows/WorkflowView.vue +++ b/src/views/workflows/WorkflowView.vue @@ -144,7 +144,13 @@ function updateWorkflow(workflowId: string) { .then((workflow) => { document.title = workflow.name + " - CloWM"; if (props.versionId == undefined) { - updateVersion(workflow.versions[0]?.workflow_version_id); + updateVersion( + calculateLatestVersion( + workflow.versions.filter( + (version) => version.status == WorkflowVersionStatus.PUBLISHED, + ) || [], + )?.workflow_version_id, + ); } }); @@ -156,7 +162,7 @@ function updateWorkflow(workflowId: string) { } function updateVersion(workflowVersionId?: string) { - if (workflowVersionId) { + if (workflowVersionId != undefined) { const possibleModes = getModesForVersion(workflowVersionId); let modeId: string | undefined = undefined; if ( @@ -174,7 +180,8 @@ function updateVersion(workflowVersionId?: string) { ) { modeId = props.workflowModeId; } - router.push({ + router.replace({ + name: "workflow-version", params: { ...route.params, versionId: workflowVersionId, @@ -297,10 +304,10 @@ onMounted(() => { >Try the latest version {{ latestVersion.version }}. </router-link> </div> - <div class="row align-items-center"> + <div v-if="props.versionId" class="row align-items-center"> <div class="w-fit position-absolute start-0"> <button - v-if="props.versionId && allowVersionDeprecation" + v-if="allowVersionDeprecation" type="button" class="btn btn-warning" @click="deprecateCurrentWorkflowVersion" -- GitLab From 0a64a9070dbc80d9df6d1db0d9cb20bdff270f1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Mon, 10 Feb 2025 16:15:34 +0000 Subject: [PATCH 06/25] Make login page responsive #191 --- src/components/AppHeader.vue | 2 +- src/views/LoginView.vue | 31 ++++++++++++++----- src/views/admin/AdminUsersView.vue | 11 ++++++- .../workflows/ListWorkflowExecutionsView.vue | 7 +++-- 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/components/AppHeader.vue b/src/components/AppHeader.vue index a9f8509..71a3320 100644 --- a/src/components/AppHeader.vue +++ b/src/components/AppHeader.vue @@ -277,7 +277,7 @@ watch( :icon="`fa-solid fa-${settingsStore.lightThemeActive ? 'sun' : 'moon'}`" /> </button> - <ul class="dropdown-menu w-fit"> + <ul class="dropdown-menu w-fit dropdown-menu-end"> <li> <button class="dropdown-item d-flex align-items-center" diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue index 60a8e5e..47721fd 100644 --- a/src/views/LoginView.vue +++ b/src/views/LoginView.vue @@ -69,10 +69,10 @@ onMounted(() => { </template> </bootstrap-toast> <div - class="position-absolute top-40 start-50 translate-middle text-center" + class="position-absolute middle-screen start-50 translate-middle text-center" style="min-width: 300px" > - <div class="fs-3 mb-3"> + <div class="fs-3 mb-3 hide-sm"> <img src="/src/assets/images/clowm.svg" class="mb-3 img-fluid" @@ -92,15 +92,15 @@ onMounted(() => { <p v-if="invitationToken" class="card-text text-secondary"> Connect your newly created <span class="clowm-blue fw-bold">Clo</span ><span class="clowm-red fw-bold">W</span - ><span class="clowm-green fw-bold">M</span> account with your - LifeScience account + ><span class="clowm-green fw-bold">M</span> account with with </p> <p v-else class="card-text text-secondary"> Login to <span class="clowm-blue fw-bold">Clo</span ><span class="clowm-red fw-bold">W</span - ><span class="clowm-green fw-bold">M</span> with LifeScience + ><span class="clowm-green fw-bold">M</span> via </p> - <div class="my-2"> + <div class="my-2 text-center"> + <div class="fs-5">LifeScience Login</div> <a :href="loginPath(OidcProvider.LIFESCIENCE_AAI)"> <img src="/src/assets/images/ls-login.png" @@ -110,7 +110,8 @@ onMounted(() => { /> </a> </div> - <div class="my-2"> + <div class="my-2 mt-4 text-center"> + <div class="fs-5">NFDI AAI</div> <a :href="loginPath(OidcProvider.NFDI_AAI)"> <img src="/src/assets/images/nfdi-aai.png" @@ -140,7 +141,21 @@ onMounted(() => { </template> <style scoped> -.top-40 { +.middle-screen { top: 40% !important; } +@media (max-height: 750px) { + .hide-sm { + display: none !important; + } + .middle-screen { + top: 50% !important; + } +} + +@media (min-height: 750px) and (max-height: 900px) { + .middle-screen { + top: 50% !important; + } +} </style> diff --git a/src/views/admin/AdminUsersView.vue b/src/views/admin/AdminUsersView.vue index 6e5a022..4969d38 100644 --- a/src/views/admin/AdminUsersView.vue +++ b/src/views/admin/AdminUsersView.vue @@ -275,7 +275,6 @@ onMounted(() => { Edit Roles </button> <button - v-if="user.invitation_token_created_at" type="button" class="btn btn-secondary btn-sm dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" @@ -286,6 +285,7 @@ onMounted(() => { <ul class="dropdown-menu"> <li> <a + v-if="user.invitation_token_created_at" class="dropdown-item" :class="{ disabled: userState.loading }" :aria-disabled="userState.loading" @@ -293,6 +293,15 @@ onMounted(() => { >Resend invitation email</a > </li> + <li> + <a + class="dropdown-item text-danger disabled" + aria-disabled="true" + > + <font-awesome-icon icon="fa-solid fa-trash" class="me-1" /> + Delete</a + > + </li> </ul> </div> </td> diff --git a/src/views/workflows/ListWorkflowExecutionsView.vue b/src/views/workflows/ListWorkflowExecutionsView.vue index a8e6108..3678bf5 100644 --- a/src/views/workflows/ListWorkflowExecutionsView.vue +++ b/src/views/workflows/ListWorkflowExecutionsView.vue @@ -355,8 +355,11 @@ onUnmounted(() => { data-bs-target="#deleteWorkflowExecutionModal" @click="executionsState.executionToDelete = execution" > - <font-awesome-icon icon="fa-solid fa-trash" /> - <span class="ms-1">Delete</span> + <font-awesome-icon + icon="fa-solid fa-trash" + class="me-1" + /> + <span>Delete</span> </button> </li> </ul> -- GitLab From 2765a99dd29267222a49ca23f4d2eaf552236d96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Tue, 11 Feb 2025 10:59:36 +0000 Subject: [PATCH 07/25] Refactor Delete modals and support deleting resources #191 --- src/components/modals/DeleteBucketModal.vue | 43 +++++++++++ src/components/modals/DeleteModal.vue | 71 ++++++++++++------- src/components/modals/DeleteObjectsModal.vue | 44 ++++++++++++ src/components/modals/DeleteResourceModal.vue | 48 +++++++++++++ src/components/modals/DeleteUserModal.vue | 49 ++++++------- src/components/modals/DeleteWorkflowModal.vue | 48 +++++++++++++ src/components/resources/ResourceCard.vue | 11 +++ src/stores/resources.ts | 12 ++++ src/views/LoginView.vue | 2 +- src/views/object-storage/BucketView.vue | 14 ++-- src/views/object-storage/BucketsView.vue | 11 ++- src/views/resources/MyResourcesView.vue | 28 +++++++- src/views/workflows/MyWorkflowsView.vue | 12 ++-- 13 files changed, 310 insertions(+), 83 deletions(-) create mode 100644 src/components/modals/DeleteBucketModal.vue create mode 100644 src/components/modals/DeleteObjectsModal.vue create mode 100644 src/components/modals/DeleteResourceModal.vue create mode 100644 src/components/modals/DeleteWorkflowModal.vue diff --git a/src/components/modals/DeleteBucketModal.vue b/src/components/modals/DeleteBucketModal.vue new file mode 100644 index 0000000..6903e74 --- /dev/null +++ b/src/components/modals/DeleteBucketModal.vue @@ -0,0 +1,43 @@ +<script setup lang="ts"> +import DeleteModal from "./DeleteModal.vue"; +import type { BucketOut } from "@/client/types.gen.ts"; + +const props = defineProps<{ + modalId: string; + bucket?: BucketOut; + backModalId?: string; +}>(); + +const emit = defineEmits<{ + (e: "confirm-delete", bucketName: string): void; +}>(); + +function deleteBucket() { + if (props.bucket != undefined) { + emit("confirm-delete", props.bucket.name); + window._paq?.push(["trackEvent", "delete", "bucket", props.bucket.name]); + } +} +</script> + +<template> + <delete-modal + :modal-id="props.modalId" + :back-modal-id="props.backModalId" + delete-type="Bucket" + :disabled="props.bucket == undefined" + @confirm-delete="deleteBucket" + > + <template #body> + <p> + Are you sure you want to delete the bucket + <strong v-if="props.bucket">{{ props.bucket.name }}</strong + >?<br /> + All files inside this bucket will be deleted to and won't be accessible + anymore + </p> + </template> + </delete-modal> +</template> + +<style scoped></style> diff --git a/src/components/modals/DeleteModal.vue b/src/components/modals/DeleteModal.vue index a87f103..7b4418f 100644 --- a/src/components/modals/DeleteModal.vue +++ b/src/components/modals/DeleteModal.vue @@ -1,5 +1,5 @@ <script setup lang="ts"> -import { onMounted, ref } from "vue"; +import { computed, onMounted, ref, useSlots } from "vue"; import { Modal } from "bootstrap"; import BootstrapModal from "@/components/modals/BootstrapModal.vue"; @@ -7,12 +7,15 @@ const props = defineProps<{ modalId: string; objectNameDelete?: string; backModalId?: string; + disabled?: boolean; + deleteType?: string; }>(); const confirmDelete = ref<boolean>(false); const emit = defineEmits<{ (e: "confirm-delete"): void; }>(); +const slots = useSlots(); let deleteModal: Modal | null = null; const randomIDSuffix = Math.random().toString(16).substring(2, 8); @@ -21,12 +24,19 @@ function modalClosed() { confirmDelete.value = false; } -function deleteObject() { +function deleteStuff() { emit("confirm-delete"); deleteModal?.hide(); confirmDelete.value = false; } +const deleteButtonDisabled = computed<boolean>(() => { + if (slots.confirmDelete != undefined) { + return props.disabled; + } + return !confirmDelete.value || props.disabled; +}); + onMounted(() => { deleteModal = Modal.getOrCreateInstance("#" + props.modalId); }); @@ -36,31 +46,35 @@ onMounted(() => { <bootstrap-modal :modal-id="props.modalId" :static-backdrop="true" - modal-label="Confirm Delete Modal" + :modal-label="`Confirm Delete ${props.deleteType != undefined ? props.deleteType + ' ' : ''}Modal`" v-on="{ 'hidden.bs.modal': modalClosed }" > - <template #header> Delete {{ props.objectNameDelete }}</template> + <template #header>Are you absolutely sure?</template> <template #body> - <p> - Are you sure you want to delete - <strong v-if="props.objectNameDelete">{{ - props.objectNameDelete - }}</strong> - </p> - <div class="form-check"> - <input - :id="'checkConfirmDelete' + randomIDSuffix" - v-model="confirmDelete" - class="form-check-input" - type="checkbox" - /> - <label - class="form-check-label" - :for="'checkConfirmDelete' + randomIDSuffix" - > - <strong>Yes</strong>, I am sure. - </label> - </div> + <slot name="body"> + <p> + Are you sure you want to delete + <span v-if="props.objectNameDelete">{{ + props.objectNameDelete + }}</span> + </p> + </slot> + <slot name="confirmDelete"> + <div class="form-check"> + <input + :id="'checkConfirmDelete' + randomIDSuffix" + v-model="confirmDelete" + class="form-check-input" + type="checkbox" + /> + <label + class="form-check-label" + :for="'checkConfirmDelete' + randomIDSuffix" + > + <strong>Yes</strong>, I am sure. + </label> + </div> + </slot> </template> <template #footer> <button @@ -83,10 +97,13 @@ onMounted(() => { <button type="button" class="btn btn-danger" - :disabled="!confirmDelete" - @click="deleteObject" + :disabled="deleteButtonDisabled" + @click="deleteStuff" > - Delete + Yes, delete + <span v-if="props.deleteType" class="text-lowercase">{{ + props.deleteType + }}</span> </button> </template> </bootstrap-modal> diff --git a/src/components/modals/DeleteObjectsModal.vue b/src/components/modals/DeleteObjectsModal.vue new file mode 100644 index 0000000..8c08a63 --- /dev/null +++ b/src/components/modals/DeleteObjectsModal.vue @@ -0,0 +1,44 @@ +<script setup lang="ts"> +import DeleteModal from "./DeleteModal.vue"; + +const props = defineProps<{ + modalId: string; + objectKeys: string[]; + backModalId?: string; +}>(); + +const emit = defineEmits<{ + (e: "confirm-delete", keys: string[]): void; +}>(); + +function deleteObjects() { + if (props.objectKeys.length > 0) { + emit("confirm-delete", props.objectKeys); + window._paq?.push(["trackEvent", "delete", "objects"]); + } +} +</script> + +<template> + <delete-modal + :modal-id="props.modalId" + :back-modal-id="props.backModalId" + delete-type="Objects" + :disabled="props.objectKeys.length === 0" + @confirm-delete="deleteObjects" + > + <template #body> + <div> + Are you sure you want to delete {{ props.objectKeys.length }} objects? + </div> + <ul> + <li v-for="key in objectKeys.slice(0, 6)" :key="key"> + {{ key }} + </li> + <li v-if="objectKeys.length > 6">...</li> + </ul> + </template> + </delete-modal> +</template> + +<style scoped></style> diff --git a/src/components/modals/DeleteResourceModal.vue b/src/components/modals/DeleteResourceModal.vue new file mode 100644 index 0000000..1d28112 --- /dev/null +++ b/src/components/modals/DeleteResourceModal.vue @@ -0,0 +1,48 @@ +<script setup lang="ts"> +import type { ResourceOut } from "@/client/types.gen.ts"; +import DeleteModal from "./DeleteModal.vue"; + +const props = defineProps<{ + modalId: string; + resource?: ResourceOut; + backModalId?: string; +}>(); + +const emit = defineEmits<{ + (e: "confirm-delete", resourceId: string): void; +}>(); + +function deleteResource() { + if (props.resource != undefined) { + emit("confirm-delete", props.resource.resource_id); + window._paq?.push([ + "trackEvent", + "delete", + "resource", + props.resource.resource_id, + ]); + } +} +</script> + +<template> + <delete-modal + :modal-id="props.modalId" + :back-modal-id="props.backModalId" + delete-type="Resource" + :disabled="props.resource == undefined" + @confirm-delete="deleteResource" + > + <template #body> + <p> + Are you sure you want to delete the workflow + <strong v-if="props.resource">{{ props.resource.name }}</strong> and its + {{ props.resource?.versions.length }} versions?<br /> + This is not reversible and all data will be delete on the cluster and in + S3. + </p> + </template> + </delete-modal> +</template> + +<style scoped></style> diff --git a/src/components/modals/DeleteUserModal.vue b/src/components/modals/DeleteUserModal.vue index b327b23..5125808 100644 --- a/src/components/modals/DeleteUserModal.vue +++ b/src/components/modals/DeleteUserModal.vue @@ -1,10 +1,9 @@ <script setup lang="ts"> -import { computed, onMounted, ref } from "vue"; -import { Modal } from "bootstrap"; -import BootstrapModal from "@/components/modals/BootstrapModal.vue"; +import { computed, ref } from "vue"; import type { UserOut } from "@/client"; import { useSettingsStore, useUserStore } from "@/stores"; import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import DeleteModal from "./DeleteModal.vue"; const props = defineProps<{ modalId: string; @@ -20,7 +19,6 @@ const textInputElement = ref<HTMLInputElement | undefined>(undefined); const userRepository = useUserStore(); const settings = useSettingsStore(); -let deleteModal: Modal | null = null; const randomIDSuffix = Math.random().toString(16).substring(2, 8); function modalClosed() { @@ -33,7 +31,7 @@ function modalShown() { function deleteUser() { emit("confirm-delete", props.user.uid); - deleteModal?.hide(); + window._paq?.push(["trackEvent", "delete", "user", props.user.uid]); confirmDelete.value = ""; } @@ -50,21 +48,16 @@ const confirmDeleteString = computed<string>( const deleteCurrentUser = computed<boolean>( () => props.user.uid === userRepository.currentUID, ); - -onMounted(() => { - deleteModal = Modal.getOrCreateInstance("#" + props.modalId); -}); </script> <template> - <bootstrap-modal + <delete-modal :modal-id="props.modalId" - :static-backdrop="true" - size-modifier-modal="lg" - modal-label="Confirm Delete User Modal" - v-on="{ 'hidden.bs.modal': modalClosed, 'shown.bs.modal': modalShown }" + delete-type="Account" + :disabled="confirmDelete !== confirmDeleteString" + @confirm-delete="deleteUser" + v-on="{ 'shown.bs.modal': modalShown, 'hidden.bs.modal': modalClosed }" > - <template #header>Are you absolutely sure?</template> <template #body> <div v-if="deleteCurrentUser"> <div class="text-danger"> @@ -81,6 +74,17 @@ onMounted(() => { <li v-if="userRepository.resourceMaintainer">Your CloWM resources</li> </ul> </div> + <div v-else> + <div class="text-danger"> + <font-awesome-icon icon="fa-solid fa-circle-exclamation" /> + You are about to delete the account of + <strong>{{ user.display_name }}</strong + >. You won't be able to log in to CloWM anymore and won't have access + to his data etc. + </div> + </div> + </template> + <template #confirmDelete> <p> Enter the following to confirm: <br /><code class="rounded p-1 user-select-none" @@ -100,20 +104,7 @@ onMounted(() => { /> </div> </template> - <template #footer> - <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> - Cancel - </button> - <button - type="button" - class="btn btn-danger" - :disabled="confirmDelete !== confirmDeleteString" - @click="deleteUser" - > - Yes, delete account - </button> - </template> - </bootstrap-modal> + </delete-modal> </template> <style scoped></style> diff --git a/src/components/modals/DeleteWorkflowModal.vue b/src/components/modals/DeleteWorkflowModal.vue new file mode 100644 index 0000000..535ef7c --- /dev/null +++ b/src/components/modals/DeleteWorkflowModal.vue @@ -0,0 +1,48 @@ +<script setup lang="ts"> +import type { WorkflowOut } from "@/client/types.gen.ts"; +import DeleteModal from "./DeleteModal.vue"; + +const props = defineProps<{ + modalId: string; + workflow?: WorkflowOut; + backModalId?: string; +}>(); + +const emit = defineEmits<{ + (e: "confirm-delete", workflowId: string): void; +}>(); + +function deleteWorkflow() { + if (props.workflow != undefined) { + emit("confirm-delete", props.workflow.workflow_id); + window._paq?.push([ + "trackEvent", + "delete", + "workflow", + props.workflow.workflow_id, + ]); + } +} +</script> + +<template> + <delete-modal + :modal-id="props.modalId" + :back-modal-id="props.backModalId" + delete-type="Workflow" + :disabled="props.workflow == undefined" + @confirm-delete="deleteWorkflow" + > + <template #body> + <p> + Are you sure you want to delete the workflow + <strong v-if="props.workflow">{{ props.workflow.name }}</strong> and its + {{ props.workflow?.versions.length }} versions?<br /> + This is not reversible and all KPIs related to this workflow will be + lost. + </p> + </template> + </delete-modal> +</template> + +<style scoped></style> diff --git a/src/components/resources/ResourceCard.vue b/src/components/resources/ResourceCard.vue index 1ed4c71..b362c32 100644 --- a/src/components/resources/ResourceCard.vue +++ b/src/components/resources/ResourceCard.vue @@ -57,6 +57,7 @@ const emit = defineEmits<{ (e: "click-request-sync", resourceVersion: ResourceVersionOut): void; (e: "click-show-otr", resourceId: string): void; (e: "click-create-otr", resource: ResourceOut): void; + (e: "click-delete", resource: ResourceOut): void; }>(); const resourceVersionS3Ready = ref<Record<string, boolean>>({}); @@ -219,6 +220,16 @@ onMounted(() => { Transfer ownership </button> </li> + <li> + <button + type="button" + class="dropdown-item text-danger" + @click="emit('click-delete', resource)" + > + <font-awesome-icon icon="fa-solid fa-trash" class="=me-2" /> + Delete + </button> + </li> </ul> </div> </div> diff --git a/src/stores/resources.ts b/src/stores/resources.ts index cb903a9..5549f8c 100644 --- a/src/stores/resources.ts +++ b/src/stores/resources.ts @@ -484,5 +484,17 @@ export const useResourceStore = defineStore("resources", { return resource; }); }, + delete(resourceId: string): Promise<void> { + return ResourceService.resourceDeleteResource({ + path: { + rid: resourceId, + }, + }).then(() => { + delete this.resourceMapping[resourceId]; + delete this.ownResourceMapping[resourceId]; + delete this.reviewableResourceMapping[resourceId]; + delete this.syncRequestMapping[resourceId]; + }); + }, }, }); diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue index 47721fd..c24cab0 100644 --- a/src/views/LoginView.vue +++ b/src/views/LoginView.vue @@ -92,7 +92,7 @@ onMounted(() => { <p v-if="invitationToken" class="card-text text-secondary"> Connect your newly created <span class="clowm-blue fw-bold">Clo</span ><span class="clowm-red fw-bold">W</span - ><span class="clowm-green fw-bold">M</span> account with with + ><span class="clowm-green fw-bold">M</span> account with </p> <p v-else class="card-text text-secondary"> Login to <span class="clowm-blue fw-bold">Clo</span diff --git a/src/views/object-storage/BucketView.vue b/src/views/object-storage/BucketView.vue index 6ae8d44..29d3f77 100644 --- a/src/views/object-storage/BucketView.vue +++ b/src/views/object-storage/BucketView.vue @@ -15,7 +15,6 @@ import CopyObjectModal from "@/components/object-storage/modals/CopyObjectModal. import PermissionModal from "@/components/object-storage/modals/PermissionModal.vue"; import ObjectDetailModal from "@/components/object-storage/modals/ObjectDetailModal.vue"; import CreateFolderModal from "@/components/object-storage/modals/CreateFolderModal.vue"; -import DeleteModal from "@/components/modals/DeleteModal.vue"; import type { _Object as S3Object } from "@aws-sdk/client-s3"; import { useUserStore } from "@/stores/users"; import { useBucketStore } from "@/stores/buckets"; @@ -25,6 +24,7 @@ import BootstrapToast from "@/components/BootstrapToast.vue"; import { useSettingsStore } from "@/stores/settings"; import { md5 } from "@/utils/md5"; import DownloadObjectsModal from "@/components/object-storage/modals/DownloadObjectsModal.vue"; +import DeleteObjectsModal from "@/components/modals/DeleteObjectsModal.vue"; const authStore = useUserStore(); const bucketRepository = useBucketStore(); @@ -493,16 +493,10 @@ function clickBox() { :keys="objectState.selectedObjs" :ignore-prefix="currentSubFolders.join('/') + '/'" /> - <delete-modal + <delete-objects-modal modal-id="delete-object-modal" - :object-name-delete=" - deleteObjectsState.potentialObjectsToDelete.length === 1 - ? deleteObjectsState.potentialObjectsToDelete[0] - : 'selected items' - " - @confirm-delete=" - confirmedDeleteKeys(deleteObjectsState.potentialObjectsToDelete) - " + :object-keys="deleteObjectsState.potentialObjectsToDelete" + @confirm-delete="confirmedDeleteKeys" /> <!-- Navbar Breadcrumb --> <nav aria-label="breadcrumb" class="fs-2"> diff --git a/src/views/object-storage/BucketsView.vue b/src/views/object-storage/BucketsView.vue index 06aacba..208b713 100644 --- a/src/views/object-storage/BucketsView.vue +++ b/src/views/object-storage/BucketsView.vue @@ -8,7 +8,6 @@ import { OwnershipTypeEnum } from "@/client/types.gen"; import { useRouter } from "vue-router"; import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; import CreateBucketModal from "@/components/object-storage/modals/CreateBucketModal.vue"; -import DeleteModal from "@/components/modals/DeleteModal.vue"; import BucketListItem from "@/components/object-storage/BucketListItem.vue"; import { useBucketStore } from "@/stores/buckets"; import { Modal, Tooltip } from "bootstrap"; @@ -18,6 +17,7 @@ import { useOTRStore } from "@/stores/otrs"; import BucketDetailModal from "@/components/object-storage/modals/BucketDetailModal.vue"; import ListOtrsModal from "@/components/modals/ListOtrsModal.vue"; import OtrModal from "@/components/modals/ShowOtrModal.vue"; +import DeleteBucketModal from "@/components/modals/DeleteBucketModal.vue"; const router = useRouter(); const bucketRepository = useBucketStore(); @@ -123,13 +123,12 @@ onMounted(() => { </script> <template> - <DeleteModal + <delete-bucket-modal modal-id="delete-bucket-modal" - :object-name-delete="bucketsState.potentialDeleteBucketName" - :back-modal-id="undefined" - @confirm-delete=" - confirmedDeleteBucket(bucketsState.potentialDeleteBucketName) + :bucket=" + bucketRepository.bucketMapping[bucketsState.potentialDeleteBucketName] " + @confirm-delete="confirmedDeleteBucket" /> <CreateBucketModal v-if="!authStore.foreignUser" diff --git a/src/views/resources/MyResourcesView.vue b/src/views/resources/MyResourcesView.vue index 02436e4..d5d12c0 100644 --- a/src/views/resources/MyResourcesView.vue +++ b/src/views/resources/MyResourcesView.vue @@ -23,6 +23,7 @@ import ListOtrsModal from "@/components/modals/ListOtrsModal.vue"; import { useOTRStore } from "@/stores/otrs"; import { useUserStore } from "@/stores/users"; import { useSettingsStore } from "@/stores/settings"; +import DeleteResourceModal from "@/components/modals/DeleteResourceModal.vue"; const resourceRepository = useResourceStore(); const s3KeyRepository = useS3KeyStore(); @@ -33,6 +34,7 @@ const settingsStore = useSettingsStore(); let showOtrModalInstance: Modal | null = null; let createOtrModalInstance: Modal | null = null; let requestReasonModal: Modal | null = null; +let deleteModal: Modal | null = null; let syncRequestSuccessToast: Toast | null = null; const resourceState = reactive<{ @@ -40,12 +42,14 @@ const resourceState = reactive<{ resourceVersionInfo?: ResourceVersionOut; updateResource: ResourceOut; syncResourceVersion?: ResourceVersionOut; + deleteResource: string; showOtrTarget: string; createOtrTarget: ResourceOut; }>({ loading: true, resourceVersionInfo: undefined, syncResourceVersion: undefined, + deleteResource: "", showOtrTarget: "", createOtrTarget: { name: "", @@ -93,6 +97,15 @@ function showCreateOtrModal(resource: ResourceOut) { createOtrModalInstance?.show(); } +function showDeleteResourceModal(resource: ResourceOut) { + resourceState.deleteResource = resource.resource_id; + deleteModal?.show(); +} + +function deleteResource(resource_id: string) { + resourceRepository.delete(resource_id); +} + function requestResourceSync( reason: string, resourceVersion?: ResourceVersionOut, @@ -112,12 +125,15 @@ function requestResourceSync( onMounted(() => { new Tooltip("#showResourceOtrsButtons"); let fetchedResources = false; - requestReasonModal = new Modal("#request-synchronization-modal"); - syncRequestSuccessToast = new Toast("#request-sync-toast"); + requestReasonModal = Modal.getOrCreateInstance( + "#request-synchronization-modal", + ); + syncRequestSuccessToast = Toast.getOrCreateInstance("#request-sync-toast"); showOtrModalInstance = Modal.getOrCreateInstance("#view-resource-otr-modal"); createOtrModalInstance = Modal.getOrCreateInstance( "#create-resource-otr-modal", ); + deleteModal = Modal.getOrCreateInstance("#delete-resource-modal"); otrRepository.fetchOwnOtrs(OwnershipTypeEnum.RESOURCE); s3KeyRepository.fetchS3Keys(() => { if (!fetchedResources) { @@ -131,6 +147,13 @@ onMounted(() => { </script> <template> + <delete-resource-modal + modal-id="delete-resource-modal" + :resource=" + resourceRepository.ownResourceMapping[resourceState.deleteResource] + " + @confirm-delete="deleteResource" + /> <otr-modal :otr-target-id="resourceState.showOtrTarget" modal-id="view-resource-otr-modal" @@ -241,6 +264,7 @@ onMounted(() => { @click-request-sync="setResourceSync" @click-show-otr="showOtrModal" @click-create-otr="showCreateOtrModal" + @click-delete="showDeleteResourceModal" /> </CardTransitionGroup> </div> diff --git a/src/views/workflows/MyWorkflowsView.vue b/src/views/workflows/MyWorkflowsView.vue index bf20bdc..9ea093c 100644 --- a/src/views/workflows/MyWorkflowsView.vue +++ b/src/views/workflows/MyWorkflowsView.vue @@ -14,7 +14,6 @@ import WorkflowWithVersionsCard from "@/components/workflows/WorkflowWithVersion import CreateWorkflowModal from "@/components/workflows/modals/CreateWorkflowModal.vue"; import CardTransitionGroup from "@/components/transitions/CardTransitionGroup.vue"; import UpdateWorkflowModal from "@/components/workflows/modals/UpdateWorkflowModal.vue"; -import DeleteModal from "@/components/modals/DeleteModal.vue"; import UpdateWorkflowVersionIconModal from "@/components/workflows/modals/UpdateWorkflowVersionIconModal.vue"; import UpdateWorkflowCredentialsModal from "@/components/workflows/modals/UpdateWorkflowCredentialsModal.vue"; import { useWorkflowStore } from "@/stores/workflows"; @@ -28,6 +27,7 @@ import { useUserStore } from "@/stores/users"; import { Modal, Tooltip } from "bootstrap"; import { useSettingsStore } from "@/stores/settings"; import CreateOtrModal from "@/components/modals/CreateOtrModal.vue"; +import DeleteWorkflowModal from "@/components/modals/DeleteWorkflowModal.vue"; const workflowRepository = useWorkflowStore(); const workflowExecutionRepository = useWorkflowExecutionStore(); @@ -169,14 +169,10 @@ onMounted(() => { :workflow="workflowsState.updateWorkflow" modal-id="updateWorkflowModal" /> - <delete-modal + <delete-workflow-modal modal-id="deleteWorkflowModal" - :object-name-delete="workflowsState.potentialWorkflowDelete?.name" - @confirm-delete=" - confirmedWorkflowDelete( - workflowsState.potentialWorkflowDelete?.workflow_id, - ) - " + :workflow="workflowsState.potentialWorkflowDelete" + @confirm-delete="confirmedWorkflowDelete" /> <update-workflow-version-icon-modal modal-id="updateWorkflowVersionIconModal" -- GitLab From a6fd658bcef6c2476476b42d09e8ba0c4449ce43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Tue, 11 Feb 2025 14:43:13 +0000 Subject: [PATCH 08/25] Add S3 key delete modal #191 --- src/components/modals/DeleteS3KeyModal.vue | 41 +++++++++ src/views/object-storage/S3KeyView.vue | 102 +++++++++++++++------ 2 files changed, 117 insertions(+), 26 deletions(-) create mode 100644 src/components/modals/DeleteS3KeyModal.vue diff --git a/src/components/modals/DeleteS3KeyModal.vue b/src/components/modals/DeleteS3KeyModal.vue new file mode 100644 index 0000000..57a2dbb --- /dev/null +++ b/src/components/modals/DeleteS3KeyModal.vue @@ -0,0 +1,41 @@ +<script setup lang="ts"> +import DeleteModal from "./DeleteModal.vue"; + +const props = defineProps<{ + modalId: string; + accessKey?: string; + backModalId?: string; +}>(); + +const emit = defineEmits<{ + (e: "confirm-delete", keyId: string): void; +}>(); + +function deleteKey() { + if (props.accessKey != undefined) { + emit("confirm-delete", props.accessKey); + window._paq?.push(["trackEvent", "delete", "s3key", props.accessKey]); + } +} +</script> + +<template> + <delete-modal + :modal-id="props.modalId" + :back-modal-id="props.backModalId" + delete-type="S3 Key" + :disabled="props.accessKey == undefined" + @confirm-delete="deleteKey" + > + <template #body> + <p> + Are you sure you want to delete the S3 key with the ID + <strong v-if="props.accessKey">{{ props.accessKey }}</strong + >?<br /> + You can't access your buckets with this key anymore. + </p> + </template> + </delete-modal> +</template> + +<style scoped></style> diff --git a/src/views/object-storage/S3KeyView.vue b/src/views/object-storage/S3KeyView.vue index 66af943..8c29c38 100644 --- a/src/views/object-storage/S3KeyView.vue +++ b/src/views/object-storage/S3KeyView.vue @@ -1,10 +1,10 @@ <script setup lang="ts"> import type { S3Key } from "@/client"; -import { reactive, watch } from "vue"; +import { ref, watch } from "vue"; import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; -import DeleteModal from "@/components/modals/DeleteModal.vue"; import { environment } from "@/environment"; import CopyToClipboardIcon from "@/components/CopyToClipboardIcon.vue"; +import DeleteS3KeyModal from "@/components/modals/DeleteS3KeyModal.vue"; const props = defineProps<{ s3key: S3Key; @@ -19,28 +19,22 @@ const emit = defineEmits<{ watch( () => props.s3key.access_key, () => { - visibleKeys.secret = false; + visibleSecretKey.value = false; }, ); -const visibleKeys = reactive<{ - secret: boolean; - access: boolean; -}>({ - secret: false, - access: true, -}); +const visibleSecretKey = ref<boolean>(false); -function deleteKeyTrigger() { +function deleteKeyTrigger(keyId: string) { if (props.deletable) { - emit("delete-key", props.s3key.access_key); + emit("delete-key", keyId); } } </script> <template> - <delete-modal + <delete-s3-key-modal modal-id="delete-key-modal" - :object-name-delete="'S3 Key ' + props.s3key.access_key" + :access-key="props.s3key.access_key" @confirm-delete="deleteKeyTrigger" /> <h3>S3 Endpoint:</h3> @@ -62,18 +56,10 @@ function deleteKeyTrigger() { <span class="placeholder col-5 mt-3 mb-2 fs-4"></span><br /> </div> <div v-else class="input-group mb-2"> - <span - class="input-group-text cursor-pointer" - @click="visibleKeys.access = !visibleKeys.access" - > - <font-awesome-icon - :icon="visibleKeys.access ? 'fa-solid fa-eye' : 'fa-solid fa-eye-slash'" - /> - </span> <input id="s3-access-key" class="form-control" - :type="visibleKeys.access ? 'text' : 'password'" + type="text" :value="props.s3key.access_key" aria-label="S3 Access Key" readonly @@ -89,16 +75,16 @@ function deleteKeyTrigger() { <div v-else class="input-group fs-4 mb-3"> <span class="input-group-text cursor-pointer" - @click="visibleKeys.secret = !visibleKeys.secret" + @click="visibleSecretKey = !visibleSecretKey" > <font-awesome-icon - :icon="visibleKeys.secret ? 'fa-solid fa-eye' : 'fa-solid fa-eye-slash'" + :icon="visibleSecretKey ? 'fa-solid fa-eye' : 'fa-solid fa-eye-slash'" /> </span> <input id="s3-secret-key" class="form-control" - :type="visibleKeys.secret ? 'text' : 'password'" + :type="visibleSecretKey ? 'text' : 'password'" :value="props.s3key.secret_key" aria-label="S3 Access Key" readonly @@ -142,6 +128,70 @@ function deleteKeyTrigger() { </li> <li><a target="_blank" href="https://rclone.org/s3/#ceph">Rclone</a></li> </ul> + <div class="alert alert-warning" role="alert"> + <h5 class="alert-heading">Incompatible S3 SDKs</h5> + <p> + Since January 16, 2025 the AWS S3 SDKs adopts new + <a + href="https://docs.aws.amazon.com/sdkref/latest/guide/feature-dataintegrity.html" + >default integrity protections</a + > + that are not compatible with our Ceph version yet. If you are using an AWS + S3 SDK to communicate with our storage you have to pin the version of your + SDK to be compatible. + </p> + <div> + Here is a list of programming languages and the supported SDK version: + </div> + <ul> + <li> + <a href="https://aws.amazon.com/sdk-for-cpp/">C++</a> + <code><v1.11.486</code> + </li> + <li> + <a href="https://aws.amazon.com/sdk-for-go/">Go</a> + <code><v1.73.0</code> + </li> + <li> + <a href="https://aws.amazon.com/sdk-for-java/">Java</a> + <code><v2.30.0</code> + </li> + <li> + <a href="https://aws.amazon.com/sdk-for-javascript/" + >Javascript/Typescript</a + > + <code><v3.729.0</code> + </li> + <li> + <a href="https://aws.amazon.com/sdk-for-kotlin/">Kotlin</a> + <code><v1.4.0</code> + </li> + <li> + <a href="https://aws.amazon.com/sdk-for-net/">.NET</a> + <code><v3.7.412.0</code> + </li> + <li> + <a href="https://aws.amazon.com/sdk-for-php/">PHP</a> + <code><v3.337.0</code> + </li> + <li> + <a href="https://aws.amazon.com/sdk-for-python/">Python</a> + <code><v1.36.0</code> + </li> + <li> + <a href="https://aws.amazon.com/sdk-for-ruby/">Ruby</a> + <code><v1.178.0</code> + </li> + <li> + <a href="https://aws.amazon.com/sdk-for-rust/">Rust</a> + <code><v1.69.0</code> + </li> + <li> + <a href="https://aws.amazon.com/sdk-for-swift/">Swift</a> + <code><v1.1.0</code> + </li> + </ul> + </div> </template> <style scoped></style> -- GitLab From 191f192f92d4e32132a0b147ea90285829b024d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Tue, 11 Feb 2025 15:25:03 +0000 Subject: [PATCH 09/25] Add remaining delete modals #191 --- src/components/modals/DeleteApiTokenModal.vue | 47 +++++++++++++ .../modals/DeleteExecutionModal.vue | 59 ++++++++++++++++ src/components/modals/DeleteOtrModal.vue | 68 +++++++++++++++++++ .../modals/DeletePermissionModal.vue | 50 ++++++++++++++ src/components/modals/ShowOtrModal.vue | 14 ++-- .../object-storage/modals/PermissionModal.vue | 17 ++--- src/views/user/ListApiTokenView.vue | 12 ++-- .../CreateParameterTranslationView.vue | 1 + .../workflows/ListWorkflowExecutionsView.vue | 35 ++-------- 9 files changed, 250 insertions(+), 53 deletions(-) create mode 100644 src/components/modals/DeleteApiTokenModal.vue create mode 100644 src/components/modals/DeleteExecutionModal.vue create mode 100644 src/components/modals/DeleteOtrModal.vue create mode 100644 src/components/modals/DeletePermissionModal.vue diff --git a/src/components/modals/DeleteApiTokenModal.vue b/src/components/modals/DeleteApiTokenModal.vue new file mode 100644 index 0000000..1d1f4b9 --- /dev/null +++ b/src/components/modals/DeleteApiTokenModal.vue @@ -0,0 +1,47 @@ +<script setup lang="ts"> +import DeleteModal from "./DeleteModal.vue"; +import type { ApiTokenOut } from "@/client/types.gen.ts"; + +const props = defineProps<{ + modalId: string; + token?: ApiTokenOut; + backModalId?: string; +}>(); + +const emit = defineEmits<{ + (e: "confirm-delete", tokenId: string): void; +}>(); + +function deleteToken() { + if (props.token != undefined) { + emit("confirm-delete", props.token.token_id); + window._paq?.push([ + "trackEvent", + "delete", + "api token", + props.token.token_id, + ]); + } +} +</script> + +<template> + <delete-modal + :modal-id="props.modalId" + :back-modal-id="props.backModalId" + delete-type="Api Token" + :disabled="props.token == undefined" + @confirm-delete="deleteToken" + > + <template #body> + <p> + Are you sure you want to delete the API token + <strong v-if="props.token">{{ props.token.name }}</strong + >?<br /> + You can't access the API with this token anymore. + </p> + </template> + </delete-modal> +</template> + +<style scoped></style> diff --git a/src/components/modals/DeleteExecutionModal.vue b/src/components/modals/DeleteExecutionModal.vue new file mode 100644 index 0000000..e189d0b --- /dev/null +++ b/src/components/modals/DeleteExecutionModal.vue @@ -0,0 +1,59 @@ +<script setup lang="ts"> +import DeleteModal from "./DeleteModal.vue"; +import type { WorkflowExecutionOut } from "@/client/types.gen.ts"; +import dayjs from "dayjs"; +import { useNameStore } from "@/stores"; + +const props = defineProps<{ + modalId: string; + execution?: WorkflowExecutionOut; + backModalId?: string; +}>(); + +const nameRepository = useNameStore(); + +const emit = defineEmits<{ + (e: "confirm-delete", executionId: string): void; +}>(); + +function deleteExecution() { + if (props.execution != undefined) { + emit("confirm-delete", props.execution.execution_id); + window._paq?.push([ + "trackEvent", + "delete", + "execution", + props.execution.execution_id, + ]); + } +} +</script> + +<template> + <delete-modal + :modal-id="props.modalId" + :back-modal-id="props.backModalId" + delete-type="Workflow Execution" + :disabled="props.execution == undefined" + @confirm-delete="deleteExecution" + > + <template #body> + <p> + Are you sure you want to delete the workflow execution from + {{ + dayjs.unix(execution?.start_time ?? 0).format("DD.MM.YYYY HH:mm:ss") + }} + <template v-if="execution?.workflow_id && execution.workflow_version_id" + >with the workflow + <strong + >{{ nameRepository.getName(execution.workflow_id) }}@{{ + nameRepository.getName(execution.workflow_version_id) + }}</strong + > + </template> + </p> + </template> + </delete-modal> +</template> + +<style scoped></style> diff --git a/src/components/modals/DeleteOtrModal.vue b/src/components/modals/DeleteOtrModal.vue new file mode 100644 index 0000000..00383e9 --- /dev/null +++ b/src/components/modals/DeleteOtrModal.vue @@ -0,0 +1,68 @@ +<script setup lang="ts"> +import DeleteModal from "./DeleteModal.vue"; +import { + type OwnershipTransferRequestOut, + OwnershipTypeEnum, +} from "@/client/types.gen.ts"; +import { useNameStore } from "@/stores"; + +const props = defineProps<{ + modalId: string; + otr?: OwnershipTransferRequestOut; + backModalId?: string; + otrType: OwnershipTypeEnum; +}>(); + +const nameRepository = useNameStore(); + +const emit = defineEmits<{ + (e: "confirm-delete", otr: OwnershipTransferRequestOut): void; +}>(); + +function deleteOtr() { + if (props.otr != undefined) { + emit("confirm-delete", props.otr); + window._paq?.push([ + "trackEvent", + "delete", + `${props.otrType} OTR`, + props.otr.target_id, + ]); + } +} +</script> + +<template> + <delete-modal + :modal-id="props.modalId" + :back-modal-id="props.backModalId" + :delete-type="`${otrType} transfer request`" + :disabled="props.otr == undefined" + @confirm-delete="deleteOtr" + > + <template #body> + <p> + Are you sure you want to delete the {{ props.otrType }} transfer request + for + <strong v-if="props.otr">{{ + props.otrType === OwnershipTypeEnum.BUCKET + ? props.otr.target_id + : nameRepository.getName(props.otr.target_id) + }}</strong> + <template v-if="props.otr && props.otr.current_owner_uid"> + from the user + <strong>{{ + nameRepository.getName(props.otr.current_owner_uid) + }}</strong></template + > + to the user + <strong v-if="props.otr">{{ + nameRepository.getName(props.otr.new_owner_uid) + }}</strong + >? + </p> + </template> + </delete-modal> +</template> + +<style scoped></style> diff --git a/src/components/modals/DeletePermissionModal.vue b/src/components/modals/DeletePermissionModal.vue new file mode 100644 index 0000000..dbd7f6d --- /dev/null +++ b/src/components/modals/DeletePermissionModal.vue @@ -0,0 +1,50 @@ +<script setup lang="ts"> +import DeleteModal from "./DeleteModal.vue"; +import type { BucketPermissionOut } from "@/client/types.gen.ts"; +import { useNameStore } from "@/stores"; + +const props = defineProps<{ + modalId: string; + permission?: BucketPermissionOut; + backModalId?: string; +}>(); + +const nameRepository = useNameStore(); + +const emit = defineEmits<{ + (e: "confirm-delete", permission: BucketPermissionOut): void; +}>(); + +function deletePermission() { + if (props.permission != undefined) { + emit("confirm-delete", props.permission); + window._paq?.push(["trackEvent", "delete", "permission"]); + } +} +</script> + +<template> + <delete-modal + :modal-id="props.modalId" + :back-modal-id="props.backModalId" + delete-type="Bucket Permission" + :disabled="props.permission == undefined" + @confirm-delete="deletePermission" + > + <template #body> + <p> + Are you sure you want to delete the bucket permission for + <strong v-if="props.permission">{{ + nameRepository.getName(props.permission.uid) + }}</strong> + to the bucket + <strong v-if="props.permission">{{ + props.permission.bucket_name + }}</strong + >? + </p> + </template> + </delete-modal> +</template> + +<style scoped></style> diff --git a/src/components/modals/ShowOtrModal.vue b/src/components/modals/ShowOtrModal.vue index a4ab386..f14ab2b 100644 --- a/src/components/modals/ShowOtrModal.vue +++ b/src/components/modals/ShowOtrModal.vue @@ -2,14 +2,17 @@ import BootstrapModal from "@/components/modals/BootstrapModal.vue"; import { useOTRStore } from "@/stores/otrs"; import { computed, onMounted, ref } from "vue"; -import type { OwnershipTransferRequestOut } from "@/client/types.gen"; +import { + type OwnershipTransferRequestOut, + OwnershipTypeEnum, +} from "@/client/types.gen"; import { useNameStore } from "@/stores/names"; import dayjs from "dayjs"; import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; -import DeleteModal from "@/components/modals/DeleteModal.vue"; import { useUserStore } from "@/stores/users"; import BootstrapToast from "@/components/BootstrapToast.vue"; import { Toast } from "bootstrap"; +import DeleteOtrModal from "@/components/modals/DeleteOtrModal.vue"; const otrRepository = useOTRStore(); const nameRepository = useNameStore(); @@ -69,11 +72,12 @@ onMounted(() => { </template> <template v-else #default> Successfully deleted request </template> </bootstrap-toast> - <delete-modal + <delete-otr-modal :modal-id="`delete-otr-modal-${randomIDSuffix}`" - :object-name-delete="`ownership transfer request for ${otr?.target_type} ${otr?.target_name}`" + :otr-type="otr != undefined ? otr.target_type : OwnershipTypeEnum.BUCKET" + :otr="otr" :back-modal-id="modalId" - @confirm-delete="deleteOtr(otr)" + @confirm-delete="deleteOtr" /> <bootstrap-modal :modal-id="props.modalId" diff --git a/src/components/object-storage/modals/PermissionModal.vue b/src/components/object-storage/modals/PermissionModal.vue index deae08a..62d5d3e 100644 --- a/src/components/object-storage/modals/PermissionModal.vue +++ b/src/components/object-storage/modals/PermissionModal.vue @@ -1,7 +1,6 @@ <script setup lang="ts"> import { onMounted, reactive, watch, ref, computed } from "vue"; import BootstrapModal from "@/components/modals/BootstrapModal.vue"; -import DeleteModal from "@/components/modals/DeleteModal.vue"; import SearchUserModal from "@/components/modals/SearchUserModal.vue"; import { Modal } from "bootstrap"; import dayjs from "dayjs"; @@ -17,6 +16,7 @@ import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; import { useBucketStore } from "@/stores/buckets"; import BootstrapToast from "@/components/BootstrapToast.vue"; import { useNameStore } from "@/stores/names"; +import DeletePermissionModal from "@/components/modals/DeletePermissionModal.vue"; // Props // ----------------------------------------------------------------------------- @@ -229,14 +229,13 @@ function formSubmit() { /** * Delete a permission for a bucket user combination - * @param bucketName Bucket to delete - * @param uid ID of grantee of the permission + * @param permission Bucket permission to delete */ -function confirmedDeletePermission(bucketName: string, uid: string) { +function confirmedDeletePermission(permission: BucketPermissionOut) { if (!formState.loading) { formState.loading = true; bucketRepository - .deleteBucketPermission(bucketName, uid) + .deleteBucketPermission(permission.bucket_name, permission.uid) .then(() => { permissionDeleted.value = true; emit("permission-deleted"); @@ -278,13 +277,11 @@ function toTimestampChanged(target?: HTMLInputElement | null) { </script> <template> - <delete-modal + <delete-permission-modal :modal-id="'delete-permission-modal' + randomIDSuffix" - object-name-delete="permission" + :permission="editUserPermission" :back-modal-id="modalId" - @confirm-delete=" - confirmedDeletePermission(permission.bucket_name, permission.uid) - " + @confirm-delete="confirmedDeletePermission" /> <search-user-modal :modal-id="'search-user-modal' + randomIDSuffix" diff --git a/src/views/user/ListApiTokenView.vue b/src/views/user/ListApiTokenView.vue index 5ad8678..87e69e2 100644 --- a/src/views/user/ListApiTokenView.vue +++ b/src/views/user/ListApiTokenView.vue @@ -2,12 +2,12 @@ import { onMounted, reactive } from "vue"; import { useUserStore } from "@/stores/users"; import dayjs from "dayjs"; -import DeleteModal from "@/components/modals/DeleteModal.vue"; import CreateApiTokenModal from "@/components/user/CreateApiTokenModal.vue"; import type { ApiTokenPrivateOut } from "@/client/types.gen"; import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; import CopyToClipboardIcon from "@/components/CopyToClipboardIcon.vue"; import { environment } from "@/environment"; +import DeleteApiTokenModal from "@/components/modals/DeleteApiTokenModal.vue"; const userRepository = useUserStore(); @@ -34,8 +34,8 @@ function deleteApiToken(tokenId: string) { state.deleteTokenId = tokenId; } -function confirmedDeleteApiToken() { - userRepository.deleteApiToken(state.deleteTokenId).finally(() => { +function confirmedDeleteApiToken(tokenId: string) { + userRepository.deleteApiToken(tokenId).finally(() => { state.deleteTokenId = ""; }); } @@ -59,11 +59,9 @@ onMounted(() => { modal-id="create-personal-api-token-modal" @token-created="apiTokenCreated" /> - <delete-modal + <delete-api-token-modal modal-id="delete-personal-api-token-modal" - :object-name-delete=" - userRepository.apiTokensMapping[state.deleteTokenId]?.name ?? '' - " + :token="userRepository.apiTokensMapping[state.deleteTokenId]" @confirm-delete="confirmedDeleteApiToken" /> <div diff --git a/src/views/workflows/CreateParameterTranslationView.vue b/src/views/workflows/CreateParameterTranslationView.vue index e22bc1a..4f4b134 100644 --- a/src/views/workflows/CreateParameterTranslationView.vue +++ b/src/views/workflows/CreateParameterTranslationView.vue @@ -411,6 +411,7 @@ onMounted(() => { workflowRepository.versionMapping[props.versionId]?.parameter_extension " modal-id="delete-parameter-extension-modal" + delete-type="Parameter Extension" :object-name-delete="`parameter extension of ${nameRepository.getName(props.workflowId)}@${nameRepository.getName(props.versionId)}`" @confirm-delete="deleteParameterExtension" /> diff --git a/src/views/workflows/ListWorkflowExecutionsView.vue b/src/views/workflows/ListWorkflowExecutionsView.vue index 3678bf5..1dbe0ee 100644 --- a/src/views/workflows/ListWorkflowExecutionsView.vue +++ b/src/views/workflows/ListWorkflowExecutionsView.vue @@ -4,7 +4,6 @@ import { onMounted, reactive, computed, onUnmounted } from "vue"; import type { WorkflowExecutionOut } from "@/client/types.gen"; import dayjs from "dayjs"; import { Tooltip } from "bootstrap"; -import DeleteModal from "@/components/modals/DeleteModal.vue"; import { useWorkflowStore } from "@/stores/workflows"; import { useWorkflowExecutionStore } from "@/stores/workflowExecutions"; import ParameterModal from "@/components/workflows/modals/ParameterModal.vue"; @@ -12,6 +11,7 @@ import { ExponentialBackoff } from "@/utils/BackoffStrategy"; import { useNameStore } from "@/stores/names"; import MarkdownRenderer from "@/components/MarkdownRenderer.vue"; import { useSettingsStore } from "@/stores/settings"; +import DeleteExecutionModal from "@/components/modals/DeleteExecutionModal.vue"; const workflowRepository = useWorkflowStore(); const nameRepository = useNameStore(); @@ -59,31 +59,6 @@ const sortedExecutions = computed<WorkflowExecutionOut[]>(() => { return tempList; }); -const deleteModalString = computed<string>(() => { - if (executionsState.executionToDelete === undefined) { - return ""; - } else if ( - !executionsState.executionToDelete.workflow_version_id || - !executionsState.executionToDelete.workflow_id - ) { - return `Workflow Execution from ${dayjs - .unix(executionsState.executionToDelete.start_time) - .format("DD.MM.YYYY HH:mm")}`; - } else { - return `Workflow Execution ${ - workflowRepository.workflowMapping[ - executionsState.executionToDelete.workflow_id - ].name - }@${ - workflowRepository.versionMapping[ - executionsState.executionToDelete.workflow_version_id - ].version - } from ${dayjs - .unix(executionsState.executionToDelete.start_time) - .format("DD.MM.YYYY HH:mm")}`; - } -}); - // Functions // ----------------------------------------------------------------------------- function updateExecutions() { @@ -156,12 +131,10 @@ onUnmounted(() => { </script> <template> - <delete-modal + <delete-execution-modal modal-id="deleteWorkflowExecutionModal" - :object-name-delete="deleteModalString" - @confirm-delete=" - deleteWorkflowExecution(executionsState.executionToDelete?.execution_id) - " + :execution="executionsState.executionToDelete" + @confirm-delete="deleteWorkflowExecution" /> <parameter-modal modal-id="workflowExecutionParameterModal" -- GitLab From 65e9b393123195f0307ef98a1e32d2098ffbc3d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Tue, 11 Feb 2025 16:27:56 +0000 Subject: [PATCH 10/25] Delete bucket and create bucket OTR in admin interface #191 --- src/components/modals/CreateOtrModal.vue | 46 +++++++--- src/components/modals/DeleteBucketModal.vue | 17 +++- .../modals/DeleteExecutionModal.vue | 48 ++++++---- src/stores/otrs.ts | 43 ++++++++- src/views/admin/AdminBucketsView.vue | 87 +++++++++++++++++-- .../admin/AdminWorkflowExecutionView.vue | 33 +++++++ 6 files changed, 236 insertions(+), 38 deletions(-) diff --git a/src/components/modals/CreateOtrModal.vue b/src/components/modals/CreateOtrModal.vue index ff839fb..3d06528 100644 --- a/src/components/modals/CreateOtrModal.vue +++ b/src/components/modals/CreateOtrModal.vue @@ -35,12 +35,14 @@ const otrCreateForm = ref<HTMLFormElement | undefined>(undefined); const formState = reactive<{ validated: boolean; requestIn: OwnershipTransferRequestIn; + otrExists: boolean; }>({ validated: false, requestIn: { new_owner_uid: "", comment: undefined, }, + otrExists: false, }); const targetType = computed<OwnershipTypeEnum>(() => { @@ -67,20 +69,23 @@ const targetId = computed<string>(() => { watch(targetId, (newId, oldId) => { if (newId !== oldId) { resetForm(); + checkOtrExists(); } }); function saveOtr() { - formState.validated = true; - formState.requestIn.comment = formState.requestIn.comment?.trim(); - if (otrCreateForm.value?.checkValidity()) { - otrRepository - .createOtr(targetId.value, formState.requestIn, targetType.value) - .then(() => { - createOtrModal?.hide(); - successToast?.show(); - resetForm(); - }); + if (!formState.otrExists) { + formState.validated = true; + formState.requestIn.comment = formState.requestIn.comment?.trim(); + if (otrCreateForm.value?.checkValidity()) { + otrRepository + .createOtr(targetId.value, formState.requestIn, targetType.value) + .then(() => { + createOtrModal?.hide(); + successToast?.show(); + resetForm(); + }); + } } } @@ -106,9 +111,25 @@ function resetForm() { formState.requestIn.comment = undefined; } +function checkOtrExists() { + if (targetId.value.length > 0) { + otrRepository + .fetchOtr(targetType.value, targetId.value) + .then(() => { + formState.otrExists = true; + }) + .catch(() => { + formState.otrExists = false; + }); + } else { + formState.otrExists = true; + } +} + onMounted(() => { createOtrModal = Modal.getOrCreateInstance(`#${props.modalId}`); successToast = Toast.getOrCreateInstance("#create-otr-success-toast"); + checkOtrExists(); }); </script> @@ -133,10 +154,14 @@ onMounted(() => { <b>{{ targetName }}</b></template > <template #body> + <div v-if="formState.otrExists" class="text-center"> + <i>A transfer request already exists for this {{ targetType }}.</i> + </div> <form id="create-otr-form" ref="otrCreateForm" :class="{ 'was-validated': formState.validated }" + :hidden="formState.otrExists" @submit.prevent="saveOtr" > <div class="m-1"> @@ -176,6 +201,7 @@ onMounted(() => { </template> <template #footer> <button + v-if="!formState.otrExists" type="submit" form="create-otr-form" class="btn btn-success" diff --git a/src/components/modals/DeleteBucketModal.vue b/src/components/modals/DeleteBucketModal.vue index 6903e74..855c9f7 100644 --- a/src/components/modals/DeleteBucketModal.vue +++ b/src/components/modals/DeleteBucketModal.vue @@ -1,6 +1,7 @@ <script setup lang="ts"> import DeleteModal from "./DeleteModal.vue"; import type { BucketOut } from "@/client/types.gen.ts"; +import { useNameStore, useUserStore } from "@/stores"; const props = defineProps<{ modalId: string; @@ -11,6 +12,8 @@ const props = defineProps<{ const emit = defineEmits<{ (e: "confirm-delete", bucketName: string): void; }>(); +const userRepository = useUserStore(); +const nameRepository = useNameStore(); function deleteBucket() { if (props.bucket != undefined) { @@ -31,10 +34,20 @@ function deleteBucket() { <template #body> <p> Are you sure you want to delete the bucket - <strong v-if="props.bucket">{{ props.bucket.name }}</strong + <strong v-if="props.bucket">{{ props.bucket.name }}</strong> + <template + v-if=" + props.bucket?.owner_id && + props.bucket.owner_id !== userRepository.currentUID + " + > + from the user + <strong>{{ + nameRepository.getName(props.bucket.owner_id) + }}</strong> </template >?<br /> All files inside this bucket will be deleted to and won't be accessible - anymore + anymore. </p> </template> </delete-modal> diff --git a/src/components/modals/DeleteExecutionModal.vue b/src/components/modals/DeleteExecutionModal.vue index e189d0b..5583509 100644 --- a/src/components/modals/DeleteExecutionModal.vue +++ b/src/components/modals/DeleteExecutionModal.vue @@ -2,7 +2,7 @@ import DeleteModal from "./DeleteModal.vue"; import type { WorkflowExecutionOut } from "@/client/types.gen.ts"; import dayjs from "dayjs"; -import { useNameStore } from "@/stores"; +import { useNameStore, useUserStore } from "@/stores"; const props = defineProps<{ modalId: string; @@ -11,6 +11,7 @@ const props = defineProps<{ }>(); const nameRepository = useNameStore(); +const userRepository = useUserStore(); const emit = defineEmits<{ (e: "confirm-delete", executionId: string): void; @@ -38,20 +39,37 @@ function deleteExecution() { @confirm-delete="deleteExecution" > <template #body> - <p> - Are you sure you want to delete the workflow execution from - {{ - dayjs.unix(execution?.start_time ?? 0).format("DD.MM.YYYY HH:mm:ss") - }} - <template v-if="execution?.workflow_id && execution.workflow_version_id" - >with the workflow - <strong - >{{ nameRepository.getName(execution.workflow_id) }}@{{ - nameRepository.getName(execution.workflow_version_id) - }}</strong - > - </template> - </p> + <div class="mb-4"> + Are you sure you want to delete this workflow execution? + <table v-if="props.execution" class="table table-hover mt-2"> + <tbody> + <tr v-if="execution?.workflow_id && execution.workflow_version_id"> + <th scope="row" class="text-end"><b>Workflow</b></th> + <th> + {{ nameRepository.getName(execution.workflow_id) }}@{{ + nameRepository.getName(execution.workflow_version_id) + }} + </th> + </tr> + <tr> + <th scope="row" class="text-end"><b>Start time</b></th> + <th> + {{ + dayjs + .unix(execution?.start_time ?? 0) + .format("DD.MM.YYYY HH:mm:ss") + }} + </th> + </tr> + <tr v-if="userRepository.currentUID !== execution?.executor_id"> + <th scope="row" class="text-end"><b>User</b></th> + <th> + {{ nameRepository.getName(execution?.executor_id) }} + </th> + </tr> + </tbody> + </table> + </div> </template> </delete-modal> </template> diff --git a/src/stores/otrs.ts b/src/stores/otrs.ts index 6b6bfaf..abbc564 100644 --- a/src/stores/otrs.ts +++ b/src/stores/otrs.ts @@ -30,18 +30,30 @@ export const useOTRStore = defineStore("otrs", { }, getters: { bucketOtrs(): OwnershipTransferRequestOut[] { + const currentUID = useUserStore().currentUID; return Object.values(this.otrMapping).filter( - (otr) => otr.target_type === OwnershipTypeEnum.BUCKET, + (otr) => + otr.target_type === OwnershipTypeEnum.BUCKET && + (otr.current_owner_uid === currentUID || + otr.new_owner_uid === currentUID), ); }, workflowOtrs(): OwnershipTransferRequestOut[] { + const currentUID = useUserStore().currentUID; return Object.values(this.otrMapping).filter( - (otr) => otr.target_type === OwnershipTypeEnum.WORKFLOW, + (otr) => + otr.target_type === OwnershipTypeEnum.WORKFLOW && + (otr.current_owner_uid === currentUID || + otr.new_owner_uid === currentUID), ); }, resourceOtrs(): OwnershipTransferRequestOut[] { + const currentUID = useUserStore().currentUID; return Object.values(this.otrMapping).filter( - (otr) => otr.target_type === OwnershipTypeEnum.RESOURCE, + (otr) => + otr.target_type === OwnershipTypeEnum.RESOURCE && + (otr.current_owner_uid === currentUID || + otr.new_owner_uid === currentUID), ); }, }, @@ -53,6 +65,31 @@ export const useOTRStore = defineStore("otrs", { } } }, + fetchOtr( + targetType: OwnershipTypeEnum, + otr_id: string, + ): Promise<OwnershipTransferRequestOut> { + switch (targetType) { + case OwnershipTypeEnum.BUCKET: + return BucketService.bucketGetBucketOtr({ + path: { + bucket_name: otr_id, + }, + }).then((response) => response.data!); + case OwnershipTypeEnum.WORKFLOW: + return WorkflowService.workflowGetWorkflowOtr({ + path: { + wid: otr_id, + }, + }).then((response) => response.data!); + case OwnershipTypeEnum.RESOURCE: + return ResourceService.resourceGetResourceOtr({ + path: { + rid: otr_id, + }, + }).then((response) => response.data!); + } + }, fetchOtrs( targetType: OwnershipTypeEnum, currentOwnerId?: string, diff --git a/src/views/admin/AdminBucketsView.vue b/src/views/admin/AdminBucketsView.vue index 61fed0d..1bf9519 100644 --- a/src/views/admin/AdminBucketsView.vue +++ b/src/views/admin/AdminBucketsView.vue @@ -9,9 +9,12 @@ import { useNameStore } from "@/stores/names"; import { filesize } from "filesize"; import dayjs from "dayjs"; import UpdateBucketLimitsModal from "@/components/admin/UpdateBucketLimitsModal.vue"; +import DeleteBucketModal from "@/components/modals/DeleteBucketModal.vue"; +import CreateOtrModal from "@/components/modals/CreateOtrModal.vue"; const bucketState = reactive<{ buckets: BucketOut[]; + selectBucket?: BucketOut; ownerId: string; loading: boolean; searched: boolean; @@ -19,6 +22,7 @@ const bucketState = reactive<{ updateLimitsBucket: BucketOut; }>({ buckets: [], + selectBucket: undefined, ownerId: "", loading: false, searched: false, @@ -70,6 +74,19 @@ function searchBuckets() { }); } +function deleteBucket(bucketName: string) { + bucketRepository + .deleteBucket(bucketName) + .then(() => { + bucketState.buckets = bucketState.buckets.filter( + (bucket) => bucket.name !== bucketName, + ); + }) + .finally(() => { + bucketState.selectBucket = undefined; + }); +} + function limitsUpdated(bucket: BucketOut) { const bucketIndex = bucketState.buckets.findIndex( (b) => b.name == bucket.name, @@ -81,6 +98,23 @@ function limitsUpdated(bucket: BucketOut) { </script> <template> + <delete-bucket-modal + modal-id="delete-bucket-modal" + :bucket="bucketState.selectBucket" + @confirm-delete="deleteBucket" + /> + <create-otr-modal + modal-id="create-bucket-otr-modal" + :target=" + bucketState.selectBucket ?? { + owner_id: '', + created_at: 0, + name: '', + description: '', + public: false, + } + " + /> <search-user-modal modal-id="admin-bucket-search-user-modal" @user-found="updateUser" @@ -193,15 +227,52 @@ function limitsUpdated(bucket: BucketOut) { </td> <td>{{ nameRepository.getName(bucket.owner_id) }}</td> <td> - <button - type="button" - class="btn btn-secondary btn-sm" - data-bs-toggle="modal" - :data-bs-target="'#' + updateLimitsModalId" - @click="bucketState.updateLimitsBucket = bucket" + <div + class="btn-group btn-group-sm dropdown-center dropdown-menu-start" > - Edit quotas - </button> + <button + type="button" + class="btn btn-secondary btn-sm" + data-bs-toggle="modal" + :data-bs-target="'#' + updateLimitsModalId" + @click="bucketState.updateLimitsBucket = bucket" + > + Edit quotas + </button> + <button + type="button" + class="btn btn-secondary dropdown-toggle dropdown-toggle-split" + data-bs-toggle="dropdown" + aria-expanded="false" + > + <span class="visually-hidden">Toggle Dropdown</span> + </button> + <ul class="dropdown-menu dropdown-menu"> + <li> + <button + class="dropdown-item" + type="button" + data-bs-toggle="modal" + data-bs-target="#create-bucket-otr-modal" + @click="bucketState.selectBucket = bucket" + > + Transfer ownership + </button> + </li> + <li> + <button + class="dropdown-item text-danger align-middle" + type="button" + data-bs-toggle="modal" + data-bs-target="#delete-bucket-modal" + @click="bucketState.selectBucket = bucket" + > + <font-awesome-icon icon="fa-solid fa-trash" /> + <span class="ms-1">Delete</span> + </button> + </li> + </ul> + </div> </td> </tr> </tbody> diff --git a/src/views/admin/AdminWorkflowExecutionView.vue b/src/views/admin/AdminWorkflowExecutionView.vue index a0abaaf..4e4a4bd 100644 --- a/src/views/admin/AdminWorkflowExecutionView.vue +++ b/src/views/admin/AdminWorkflowExecutionView.vue @@ -15,6 +15,7 @@ import { useNameStore } from "@/stores/names"; import dayjs from "dayjs"; import ParameterModal from "@/components/workflows/modals/ParameterModal.vue"; import MarkdownRenderer from "@/components/MarkdownRenderer.vue"; +import DeleteExecutionModal from "@/components/modals/DeleteExecutionModal.vue"; const executionRepository = useWorkflowExecutionStore(); const nameRepository = useNameStore(); @@ -53,10 +54,12 @@ const formState = reactive<{ loading: boolean; executions: WorkflowExecutionOut[]; executionParameters?: string; + deleteExecution?: WorkflowExecutionOut; }>({ loading: false, executions: [], executionParameters: undefined, + deleteExecution: undefined, }); const executionIterator = ref< @@ -139,6 +142,19 @@ function workflowExecutionCancelable(execution: WorkflowExecutionOut): boolean { return execution.end_time == undefined; } +function deleteExecution(executionId: string) { + executionRepository + .deleteExecution(executionId) + .then(() => { + formState.executions = formState.executions.filter( + (execution) => execution.execution_id !== executionId, + ); + }) + .finally(() => { + formState.deleteExecution = undefined; + }); +} + function startBeforeTimestampChanged(target?: HTMLInputElement | null) { filters.startBefore = target?.value ? dayjs(target?.value).unix() : undefined; } @@ -178,6 +194,11 @@ onMounted(() => { </script> <template> + <delete-execution-modal + modal-id="delete-execution-modal" + :execution="formState.deleteExecution" + @confirm-delete="deleteExecution" + /> <search-user-modal modal-id="admin-execution-search-user-modal" @user-found="updateUser" @@ -473,6 +494,18 @@ onMounted(() => { <span class="ms-1">Cancel</span> </button> </li> + <li v-if="!workflowExecutionCancelable(execution)"> + <button + class="dropdown-item text-danger align-middle" + type="button" + data-bs-toggle="modal" + data-bs-target="#delete-execution-modal" + @click="formState.deleteExecution = execution" + > + <font-awesome-icon icon="fa-solid fa-trash" /> + <span class="ms-1">Delete</span> + </button> + </li> </ul> </div> </td> -- GitLab From 07ef403ce757a479caecdc8c0d137d4cf0cf3d8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Tue, 11 Feb 2025 16:47:43 +0000 Subject: [PATCH 11/25] Show OTR in create Modal if it already exists * Upgrade Pinia to v3 #191 --- package-lock.json | 146 ++++++++++++++++++----- package.json | 2 +- src/components/modals/CreateOtrModal.vue | 38 ++++-- src/stores/otrs.ts | 18 ++- 4 files changed, 158 insertions(+), 46 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3533530..dfba82c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "dompurify": "~3.2.0", "filesize": "~10.1.0", "idb-keyval": "^6.2.1", - "pinia": "~2.3.0", + "pinia": "~3.0.0", "qs": "^6.13.0", "semver": "~7.7.0", "showdown": "~2.1.0", @@ -3668,6 +3668,30 @@ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", "license": "MIT" }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.1.tgz", + "integrity": "sha512-yhZ4NPnK/tmxGtLNQxmll90jIIXdb2jAhPF76anvn5M/UkZCiLJy28bYgPIACKZ7FCosyKoaope89/RsFJll1w==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.1", + "birpc": "^0.2.19", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.1" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.1.tgz", + "integrity": "sha512-BtgF7kHq4BHG23Lezc/3W2UhK2ga7a8ohAIAGJMBr4BkxUFzhqntQtCiuL1ijo2ztWnmusymkirgqUrXoQKumA==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, "node_modules/@vue/eslint-config-prettier": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-10.2.0.tgz", @@ -3967,6 +3991,15 @@ ], "license": "MIT" }, + "node_modules/birpc": { + "version": "0.2.19", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", + "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", @@ -4456,6 +4489,21 @@ "dev": true, "license": "MIT" }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -5778,6 +5826,12 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -6011,6 +6065,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -6307,6 +6373,12 @@ "node": ">=8" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -6730,7 +6802,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", - "dev": true, "license": "MIT" }, "node_modules/picocolors": { @@ -6753,13 +6824,12 @@ } }, "node_modules/pinia": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.3.1.tgz", - "integrity": "sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.0.tgz", + "integrity": "sha512-Go23UsqaeABb4OYNmpDkE9VwDnqmbbjGzWpQhi3xfNkSPO6ZP+Ttt0EMo2J4DHXW+T0l3EqRneeXdyV/oJg/Mg==", "license": "MIT", "dependencies": { - "@vue/devtools-api": "^6.6.3", - "vue-demi": "^0.14.10" + "@vue/devtools-api": "^7.7.1" }, "funding": { "url": "https://github.com/sponsors/posva" @@ -6774,6 +6844,15 @@ } } }, + "node_modules/pinia/node_modules/@vue/devtools-api": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.1.tgz", + "integrity": "sha512-Cexc8GimowoDkJ6eNelOPdYIzsu2mgNyp0scOQ3tiaYSb9iok6LOESSsJvHaI+ib3joRfqRJNLkHFjhNuWA5dg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.1" + } + }, "node_modules/pkg-dir": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", @@ -7106,6 +7185,12 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, "node_modules/ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -7435,6 +7520,15 @@ "node": ">=0.10.0" } }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", @@ -7486,6 +7580,18 @@ "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", "license": "MIT" }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -7888,32 +7994,6 @@ } } }, - "node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, "node_modules/vue-eslint-parser": { "version": "9.4.3", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", diff --git a/package.json b/package.json index ea363e1..1a3c1cf 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "dompurify": "~3.2.0", "filesize": "~10.1.0", "idb-keyval": "^6.2.1", - "pinia": "~2.3.0", + "pinia": "~3.0.0", "qs": "^6.13.0", "semver": "~7.7.0", "showdown": "~2.1.0", diff --git a/src/components/modals/CreateOtrModal.vue b/src/components/modals/CreateOtrModal.vue index 3d06528..55eb1e3 100644 --- a/src/components/modals/CreateOtrModal.vue +++ b/src/components/modals/CreateOtrModal.vue @@ -5,6 +5,7 @@ import type { UserOut, WorkflowOut, BucketOut, + OwnershipTransferRequestOut, } from "@/client/types.gen"; import { OwnershipTypeEnum } from "@/client/types.gen"; import BootstrapModal from "@/components/modals/BootstrapModal.vue"; @@ -35,14 +36,14 @@ const otrCreateForm = ref<HTMLFormElement | undefined>(undefined); const formState = reactive<{ validated: boolean; requestIn: OwnershipTransferRequestIn; - otrExists: boolean; + otrExists?: OwnershipTransferRequestOut; }>({ validated: false, requestIn: { new_owner_uid: "", comment: undefined, }, - otrExists: false, + otrExists: undefined, }); const targetType = computed<OwnershipTypeEnum>(() => { @@ -115,14 +116,21 @@ function checkOtrExists() { if (targetId.value.length > 0) { otrRepository .fetchOtr(targetType.value, targetId.value) - .then(() => { - formState.otrExists = true; + .then((otr) => { + formState.otrExists = otr; }) .catch(() => { - formState.otrExists = false; + formState.otrExists = undefined; }); } else { - formState.otrExists = true; + formState.otrExists = { + target_id: "", + new_owner_uid: "", + target_description: "", + target_name: "", + target_type: targetType.value, + created_at: 0, + }; } } @@ -154,14 +162,26 @@ onMounted(() => { <b>{{ targetName }}</b></template > <template #body> - <div v-if="formState.otrExists" class="text-center"> - <i>A transfer request already exists for this {{ targetType }}.</i> + <div v-if="formState.otrExists != undefined" class="text-center"> + <div> + <i>A transfer request already exists for this {{ targetType }}.</i> + </div> + <div class="d-flex align-items-center justify-content-center"> + <span v-if="formState.otrExists.current_owner_uid">{{ + nameRepository.getName(formState.otrExists.current_owner_uid) + }}</span + ><span v-else>None</span><span class="mx-4 fs-4">→</span + >{{ nameRepository.getName(formState.otrExists.new_owner_uid) }} + </div> + <div v-if="formState.otrExists.comment"> + {{ formState.otrExists.comment }} + </div> </div> <form id="create-otr-form" ref="otrCreateForm" :class="{ 'was-validated': formState.validated }" - :hidden="formState.otrExists" + :hidden="formState.otrExists != undefined" @submit.prevent="saveOtr" > <div class="m-1"> diff --git a/src/stores/otrs.ts b/src/stores/otrs.ts index abbc564..d403b9f 100644 --- a/src/stores/otrs.ts +++ b/src/stores/otrs.ts @@ -69,26 +69,38 @@ export const useOTRStore = defineStore("otrs", { targetType: OwnershipTypeEnum, otr_id: string, ): Promise<OwnershipTransferRequestOut> { + let promise: Promise<OwnershipTransferRequestOut>; switch (targetType) { case OwnershipTypeEnum.BUCKET: - return BucketService.bucketGetBucketOtr({ + promise = BucketService.bucketGetBucketOtr({ path: { bucket_name: otr_id, }, }).then((response) => response.data!); + break; case OwnershipTypeEnum.WORKFLOW: - return WorkflowService.workflowGetWorkflowOtr({ + promise = WorkflowService.workflowGetWorkflowOtr({ path: { wid: otr_id, }, }).then((response) => response.data!); + break; case OwnershipTypeEnum.RESOURCE: - return ResourceService.resourceGetResourceOtr({ + promise = ResourceService.resourceGetResourceOtr({ path: { rid: otr_id, }, }).then((response) => response.data!); + break; } + promise.then((otr) => { + useUserStore().fetchUsernames([ + otr.new_owner_uid, + otr.current_owner_uid, + ]); + return otr; + }); + return promise; }, fetchOtrs( targetType: OwnershipTypeEnum, -- GitLab From 330a425f9afa1a5df4af2c750d2fb6294b04bd84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Tue, 11 Feb 2025 17:02:12 +0000 Subject: [PATCH 12/25] Delete resource and create resource OTR in admin interface #191 --- src/components/modals/CreateOtrModal.vue | 3 +- src/views/admin/AdminBucketsView.vue | 14 ++--- src/views/admin/AdminResourcesView.vue | 71 ++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 8 deletions(-) diff --git a/src/components/modals/CreateOtrModal.vue b/src/components/modals/CreateOtrModal.vue index 55eb1e3..ce651fb 100644 --- a/src/components/modals/CreateOtrModal.vue +++ b/src/components/modals/CreateOtrModal.vue @@ -81,10 +81,11 @@ function saveOtr() { if (otrCreateForm.value?.checkValidity()) { otrRepository .createOtr(targetId.value, formState.requestIn, targetType.value) - .then(() => { + .then((otr) => { createOtrModal?.hide(); successToast?.show(); resetForm(); + formState.otrExists = otr; }); } } diff --git a/src/views/admin/AdminBucketsView.vue b/src/views/admin/AdminBucketsView.vue index 1bf9519..a4f8b67 100644 --- a/src/views/admin/AdminBucketsView.vue +++ b/src/views/admin/AdminBucketsView.vue @@ -14,7 +14,7 @@ import CreateOtrModal from "@/components/modals/CreateOtrModal.vue"; const bucketState = reactive<{ buckets: BucketOut[]; - selectBucket?: BucketOut; + selectedBucket?: BucketOut; ownerId: string; loading: boolean; searched: boolean; @@ -22,7 +22,7 @@ const bucketState = reactive<{ updateLimitsBucket: BucketOut; }>({ buckets: [], - selectBucket: undefined, + selectedBucket: undefined, ownerId: "", loading: false, searched: false, @@ -83,7 +83,7 @@ function deleteBucket(bucketName: string) { ); }) .finally(() => { - bucketState.selectBucket = undefined; + bucketState.selectedBucket = undefined; }); } @@ -100,13 +100,13 @@ function limitsUpdated(bucket: BucketOut) { <template> <delete-bucket-modal modal-id="delete-bucket-modal" - :bucket="bucketState.selectBucket" + :bucket="bucketState.selectedBucket" @confirm-delete="deleteBucket" /> <create-otr-modal modal-id="create-bucket-otr-modal" :target=" - bucketState.selectBucket ?? { + bucketState.selectedBucket ?? { owner_id: '', created_at: 0, name: '', @@ -254,7 +254,7 @@ function limitsUpdated(bucket: BucketOut) { type="button" data-bs-toggle="modal" data-bs-target="#create-bucket-otr-modal" - @click="bucketState.selectBucket = bucket" + @click="bucketState.selectedBucket = bucket" > Transfer ownership </button> @@ -265,7 +265,7 @@ function limitsUpdated(bucket: BucketOut) { type="button" data-bs-toggle="modal" data-bs-target="#delete-bucket-modal" - @click="bucketState.selectBucket = bucket" + @click="bucketState.selectedBucket = bucket" > <font-awesome-icon icon="fa-solid fa-trash" /> <span class="ms-1">Delete</span> diff --git a/src/views/admin/AdminResourcesView.vue b/src/views/admin/AdminResourcesView.vue index 6bb58ca..d519e64 100644 --- a/src/views/admin/AdminResourcesView.vue +++ b/src/views/admin/AdminResourcesView.vue @@ -12,6 +12,8 @@ import { useNameStore } from "@/stores/names"; import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; import dayjs from "dayjs"; import ResourceVersionInfoModal from "@/components/resources/modals/ResourceVersionInfoModal.vue"; +import DeleteResourceModal from "@/components/modals/DeleteResourceModal.vue"; +import CreateOtrModal from "@/components/modals/CreateOtrModal.vue"; const resourceRepository = useResourceStore(); const nameRepository = useNameStore(); @@ -25,6 +27,7 @@ const resourceState = reactive<{ inspectVersionIndex: number; inspectResource?: ResourceOut; searched: boolean; + selectedResource?: ResourceOut; }>({ loading: false, resources: [], @@ -34,12 +37,26 @@ const resourceState = reactive<{ inspectVersionIndex: 0, inspectResource: undefined, searched: false, + selectedResource: undefined, }); function updateUser(user: UserOut) { resourceState.maintainerId = user.uid; } +function deleteResource(resourceId: string) { + resourceRepository + .delete(resourceId) + .then(() => { + resourceState.resources = resourceState.resources.filter( + (resource) => resource.resource_id !== resourceId, + ); + }) + .finally(() => { + resourceState.selectedResource = undefined; + }); +} + function searchResources() { resourceState.loading = true; resourceRepository @@ -127,6 +144,24 @@ function resetForm() { </script> <template> + <delete-resource-modal + modal-id="delete-resource-modal" + :resource="resourceState.selectedResource" + @confirm-delete="deleteResource" + /> + <create-otr-modal + modal-id="create-resource-otr-modal" + :target=" + resourceState.selectedResource ?? { + resource_id: '', + description: '', + name: '', + source: '', + versions: [], + maintainer_id: '', + } + " + /> <search-user-modal modal-id="admin-resource-search-user-modal" @user-found="updateUser" @@ -223,6 +258,7 @@ function resetForm() { <th scope="col">Resource ID</th> <th scope="col">Source</th> <th scope="col">Maintainer</th> + <th scope="col"></th> </tr> </thead> <tbody v-if="resourceState.resources.length === 0"> @@ -245,6 +281,41 @@ function resetForm() { <td>{{ resource.resource_id }}</td> <td>{{ resource.source }}</td> <td>{{ nameRepository.getName(resource.maintainer_id) }}</td> + <td class="text-end"> + <button + class="btn btn-secondary dropdown-toggle" + type="button" + data-bs-toggle="dropdown" + aria-expanded="false" + > + Actions + </button> + <ul class="dropdown-menu"> + <li> + <button + class="dropdown-item" + type="button" + data-bs-toggle="modal" + data-bs-target="#create-resource-otr-modal" + @click="resourceState.selectedResource = resource" + > + Transfer ownership + </button> + </li> + <li> + <button + class="dropdown-item text-danger align-middle" + type="button" + data-bs-toggle="modal" + data-bs-target="#delete-resource-modal" + @click="resourceState.selectedResource = resource" + > + <font-awesome-icon icon="fa-solid fa-trash" /> + <span class="ms-1">Delete</span> + </button> + </li> + </ul> + </td> </tr> <tr> <td colspan="5"> -- GitLab From 3d8d4c4e66afdd84340db5221c2169d1d0b81076 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Wed, 12 Feb 2025 09:09:49 +0000 Subject: [PATCH 13/25] Make admin interface more responsive #191 --- package-lock.json | 196 ++++---- src/components/AppHeader.vue | 4 +- .../modals/DeleteBucketModal.vue | 2 +- .../modals/DeleteObjectsModal.vue | 2 +- .../modals/DeletePermissionModal.vue | 2 +- .../modals/DeleteS3KeyModal.vue | 2 +- .../object-storage/modals/PermissionModal.vue | 2 +- .../LastParameterizationsModal.vue | 2 +- .../UploadParameterFileModal.vue | 2 +- .../modals/DeleteResourceModal.vue | 2 +- .../{ => workflows}/ParameterTable.vue | 0 .../modals/DeleteExecutionModal.vue | 2 +- .../modals/DeleteWorkflowModal.vue | 2 +- .../workflows/modals/ParameterModal.vue | 2 +- src/views/admin/AdminBucketsView.vue | 196 ++++---- src/views/admin/AdminResourcesView.vue | 441 +++++++++--------- src/views/admin/AdminSyncRequestsView.vue | 6 +- src/views/admin/AdminUsersView.vue | 275 +++++------ .../admin/AdminWorkflowExecutionView.vue | 12 +- src/views/object-storage/BucketView.vue | 2 +- src/views/object-storage/BucketsView.vue | 2 +- src/views/object-storage/S3KeyView.vue | 2 +- src/views/resources/MyResourcesView.vue | 2 +- src/views/user/ProfileView.vue | 12 +- .../workflows/ListWorkflowExecutionsView.vue | 2 +- src/views/workflows/MyWorkflowsView.vue | 2 +- 26 files changed, 599 insertions(+), 577 deletions(-) rename src/components/{ => object-storage}/modals/DeleteBucketModal.vue (95%) rename src/components/{ => object-storage}/modals/DeleteObjectsModal.vue (93%) rename src/components/{ => object-storage}/modals/DeletePermissionModal.vue (95%) rename src/components/{ => object-storage}/modals/DeleteS3KeyModal.vue (93%) rename src/components/{ => resources}/modals/DeleteResourceModal.vue (94%) rename src/components/{ => workflows}/ParameterTable.vue (100%) rename src/components/{ => workflows}/modals/DeleteExecutionModal.vue (97%) rename src/components/{ => workflows}/modals/DeleteWorkflowModal.vue (94%) diff --git a/package-lock.json b/package-lock.json index dfba82c..ece13c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1586,9 +1586,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", - "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz", + "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1704,6 +1704,19 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", + "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@fortawesome/fontawesome-free": { "version": "6.7.2", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz", @@ -3366,17 +3379,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.23.0.tgz", - "integrity": "sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.0.tgz", + "integrity": "sha512-aFcXEJJCI4gUdXgoo/j9udUYIHgF23MFkg09LFz2dzEmU0+1Plk4rQWv/IYKvPHAtlkkGoB3m5e6oUp+JPsNaQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.23.0", - "@typescript-eslint/type-utils": "8.23.0", - "@typescript-eslint/utils": "8.23.0", - "@typescript-eslint/visitor-keys": "8.23.0", + "@typescript-eslint/scope-manager": "8.24.0", + "@typescript-eslint/type-utils": "8.24.0", + "@typescript-eslint/utils": "8.24.0", + "@typescript-eslint/visitor-keys": "8.24.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -3396,16 +3409,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.23.0.tgz", - "integrity": "sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.0.tgz", + "integrity": "sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.23.0", - "@typescript-eslint/types": "8.23.0", - "@typescript-eslint/typescript-estree": "8.23.0", - "@typescript-eslint/visitor-keys": "8.23.0", + "@typescript-eslint/scope-manager": "8.24.0", + "@typescript-eslint/types": "8.24.0", + "@typescript-eslint/typescript-estree": "8.24.0", + "@typescript-eslint/visitor-keys": "8.24.0", "debug": "^4.3.4" }, "engines": { @@ -3421,14 +3434,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.23.0.tgz", - "integrity": "sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.0.tgz", + "integrity": "sha512-HZIX0UByphEtdVBKaQBgTDdn9z16l4aTUz8e8zPQnyxwHBtf5vtl1L+OhH+m1FGV9DrRmoDuYKqzVrvWDcDozw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.23.0", - "@typescript-eslint/visitor-keys": "8.23.0" + "@typescript-eslint/types": "8.24.0", + "@typescript-eslint/visitor-keys": "8.24.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3439,14 +3452,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.23.0.tgz", - "integrity": "sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.0.tgz", + "integrity": "sha512-8fitJudrnY8aq0F1wMiPM1UUgiXQRJ5i8tFjq9kGfRajU+dbPyOuHbl0qRopLEidy0MwqgTHDt6CnSeXanNIwA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.23.0", - "@typescript-eslint/utils": "8.23.0", + "@typescript-eslint/typescript-estree": "8.24.0", + "@typescript-eslint/utils": "8.24.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, @@ -3463,9 +3476,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.23.0.tgz", - "integrity": "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.0.tgz", + "integrity": "sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw==", "dev": true, "license": "MIT", "engines": { @@ -3477,14 +3490,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.23.0.tgz", - "integrity": "sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.0.tgz", + "integrity": "sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.23.0", - "@typescript-eslint/visitor-keys": "8.23.0", + "@typescript-eslint/types": "8.24.0", + "@typescript-eslint/visitor-keys": "8.24.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3504,16 +3517,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.23.0.tgz", - "integrity": "sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.0.tgz", + "integrity": "sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.23.0", - "@typescript-eslint/types": "8.23.0", - "@typescript-eslint/typescript-estree": "8.23.0" + "@typescript-eslint/scope-manager": "8.24.0", + "@typescript-eslint/types": "8.24.0", + "@typescript-eslint/typescript-estree": "8.24.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3528,13 +3541,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.23.0.tgz", - "integrity": "sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.0.tgz", + "integrity": "sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/types": "8.24.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -3663,10 +3676,13 @@ } }, "node_modules/@vue/devtools-api": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", - "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", - "license": "MIT" + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.1.tgz", + "integrity": "sha512-Cexc8GimowoDkJ6eNelOPdYIzsu2mgNyp0scOQ3tiaYSb9iok6LOESSsJvHaI+ib3joRfqRJNLkHFjhNuWA5dg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.1" + } }, "node_modules/@vue/devtools-kit": { "version": "7.7.1", @@ -4937,9 +4953,9 @@ } }, "node_modules/eslint": { - "version": "9.20.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.0.tgz", - "integrity": "sha512-aL4F8167Hg4IvsW89ejnpTwx+B/UQRzJPGgbIOl+4XqffWsahVVsLEWoZvnrVuwpWmnRd7XeXmQI1zlKcFDteA==", + "version": "9.20.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.1.tgz", + "integrity": "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==", "dev": true, "license": "MIT", "dependencies": { @@ -5109,19 +5125,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/@eslint/core": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz", - "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -5486,9 +5489,9 @@ } }, "node_modules/for-each": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.4.tgz", - "integrity": "sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { @@ -5624,9 +5627,9 @@ } }, "node_modules/giget/node_modules/pathe": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", - "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, @@ -6406,9 +6409,9 @@ } }, "node_modules/mlly/node_modules/pathe": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", - "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, @@ -6572,9 +6575,9 @@ } }, "node_modules/nypm/node_modules/pathe": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", - "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, @@ -6844,15 +6847,6 @@ } } }, - "node_modules/pinia/node_modules/@vue/devtools-api": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.1.tgz", - "integrity": "sha512-Cexc8GimowoDkJ6eNelOPdYIzsu2mgNyp0scOQ3tiaYSb9iok6LOESSsJvHaI+ib3joRfqRJNLkHFjhNuWA5dg==", - "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^7.7.1" - } - }, "node_modules/pkg-dir": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", @@ -6879,9 +6873,9 @@ } }, "node_modules/pkg-types/node_modules/pathe": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", - "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, @@ -6896,9 +6890,9 @@ } }, "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", "funding": [ { "type": "opencollective", @@ -7753,15 +7747,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.23.0.tgz", - "integrity": "sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.0.tgz", + "integrity": "sha512-/lmv4366en/qbB32Vz5+kCNZEMf6xYHwh1z48suBwZvAtnXKbP+YhGe8OLE2BqC67LMqKkCNLtjejdwsdW6uOQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.23.0", - "@typescript-eslint/parser": "8.23.0", - "@typescript-eslint/utils": "8.23.0" + "@typescript-eslint/eslint-plugin": "8.24.0", + "@typescript-eslint/parser": "8.24.0", + "@typescript-eslint/utils": "8.24.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8079,6 +8073,12 @@ "vue": "^3.2.0" } }, + "node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, "node_modules/vue-tsc": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.0.tgz", diff --git a/src/components/AppHeader.vue b/src/components/AppHeader.vue index 71a3320..6aaa9ab 100644 --- a/src/components/AppHeader.vue +++ b/src/components/AppHeader.vue @@ -178,7 +178,7 @@ watch( Resources </a> <ul - class="dropdown-menu shadow m-0" + class="dropdown-menu shadow m-0 dropdown-menu-end" aria-labelledby="workflowDropdown" > <li> @@ -227,7 +227,7 @@ watch( Admin </a> <ul - class="dropdown-menu shadow m-0" + class="dropdown-menu shadow m-0 dropdown-menu-end" aria-labelledby="adminDropdown" > <li> diff --git a/src/components/modals/DeleteBucketModal.vue b/src/components/object-storage/modals/DeleteBucketModal.vue similarity index 95% rename from src/components/modals/DeleteBucketModal.vue rename to src/components/object-storage/modals/DeleteBucketModal.vue index 855c9f7..eb22ea6 100644 --- a/src/components/modals/DeleteBucketModal.vue +++ b/src/components/object-storage/modals/DeleteBucketModal.vue @@ -1,5 +1,5 @@ <script setup lang="ts"> -import DeleteModal from "./DeleteModal.vue"; +import DeleteModal from "@/components/modals/DeleteModal.vue"; import type { BucketOut } from "@/client/types.gen.ts"; import { useNameStore, useUserStore } from "@/stores"; diff --git a/src/components/modals/DeleteObjectsModal.vue b/src/components/object-storage/modals/DeleteObjectsModal.vue similarity index 93% rename from src/components/modals/DeleteObjectsModal.vue rename to src/components/object-storage/modals/DeleteObjectsModal.vue index 8c08a63..aae51e6 100644 --- a/src/components/modals/DeleteObjectsModal.vue +++ b/src/components/object-storage/modals/DeleteObjectsModal.vue @@ -1,5 +1,5 @@ <script setup lang="ts"> -import DeleteModal from "./DeleteModal.vue"; +import DeleteModal from "@/components/modals/DeleteModal.vue"; const props = defineProps<{ modalId: string; diff --git a/src/components/modals/DeletePermissionModal.vue b/src/components/object-storage/modals/DeletePermissionModal.vue similarity index 95% rename from src/components/modals/DeletePermissionModal.vue rename to src/components/object-storage/modals/DeletePermissionModal.vue index dbd7f6d..f97e3f1 100644 --- a/src/components/modals/DeletePermissionModal.vue +++ b/src/components/object-storage/modals/DeletePermissionModal.vue @@ -1,5 +1,5 @@ <script setup lang="ts"> -import DeleteModal from "./DeleteModal.vue"; +import DeleteModal from "@/components/modals/DeleteModal.vue"; import type { BucketPermissionOut } from "@/client/types.gen.ts"; import { useNameStore } from "@/stores"; diff --git a/src/components/modals/DeleteS3KeyModal.vue b/src/components/object-storage/modals/DeleteS3KeyModal.vue similarity index 93% rename from src/components/modals/DeleteS3KeyModal.vue rename to src/components/object-storage/modals/DeleteS3KeyModal.vue index 57a2dbb..d8e03ed 100644 --- a/src/components/modals/DeleteS3KeyModal.vue +++ b/src/components/object-storage/modals/DeleteS3KeyModal.vue @@ -1,5 +1,5 @@ <script setup lang="ts"> -import DeleteModal from "./DeleteModal.vue"; +import DeleteModal from "@/components/modals/DeleteModal.vue"; const props = defineProps<{ modalId: string; diff --git a/src/components/object-storage/modals/PermissionModal.vue b/src/components/object-storage/modals/PermissionModal.vue index 62d5d3e..6d9566b 100644 --- a/src/components/object-storage/modals/PermissionModal.vue +++ b/src/components/object-storage/modals/PermissionModal.vue @@ -16,7 +16,7 @@ import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; import { useBucketStore } from "@/stores/buckets"; import BootstrapToast from "@/components/BootstrapToast.vue"; import { useNameStore } from "@/stores/names"; -import DeletePermissionModal from "@/components/modals/DeletePermissionModal.vue"; +import DeletePermissionModal from "@/components/object-storage/modals/DeletePermissionModal.vue"; // Props // ----------------------------------------------------------------------------- diff --git a/src/components/parameter-schema/LastParameterizationsModal.vue b/src/components/parameter-schema/LastParameterizationsModal.vue index 2cf2ff6..b93df71 100644 --- a/src/components/parameter-schema/LastParameterizationsModal.vue +++ b/src/components/parameter-schema/LastParameterizationsModal.vue @@ -12,7 +12,7 @@ import type { TemporaryParams, } from "@/types/WorkflowParameters.ts"; import { flattenParameters } from "@/utils/Workflow.ts"; -import ParameterTable from "@/components/ParameterTable.vue"; +import ParameterTable from "@/components/workflows/ParameterTable.vue"; import { type RouteLocationRaw, useRouter } from "vue-router"; import { Modal } from "bootstrap"; diff --git a/src/components/parameter-schema/UploadParameterFileModal.vue b/src/components/parameter-schema/UploadParameterFileModal.vue index b90a3ef..d7b7c89 100644 --- a/src/components/parameter-schema/UploadParameterFileModal.vue +++ b/src/components/parameter-schema/UploadParameterFileModal.vue @@ -6,7 +6,7 @@ import type { FlatWorkflowParameters, } from "@/types/WorkflowParameters"; import { flattenParameters } from "@/utils/Workflow"; -import ParameterTable from "@/components/ParameterTable.vue"; +import ParameterTable from "@/components/workflows/ParameterTable.vue"; import { type RouteLocationRaw, useRouter } from "vue-router"; import { Modal } from "bootstrap"; diff --git a/src/components/modals/DeleteResourceModal.vue b/src/components/resources/modals/DeleteResourceModal.vue similarity index 94% rename from src/components/modals/DeleteResourceModal.vue rename to src/components/resources/modals/DeleteResourceModal.vue index 1d28112..f132cbc 100644 --- a/src/components/modals/DeleteResourceModal.vue +++ b/src/components/resources/modals/DeleteResourceModal.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> import type { ResourceOut } from "@/client/types.gen.ts"; -import DeleteModal from "./DeleteModal.vue"; +import DeleteModal from "@/components/modals/DeleteModal.vue"; const props = defineProps<{ modalId: string; diff --git a/src/components/ParameterTable.vue b/src/components/workflows/ParameterTable.vue similarity index 100% rename from src/components/ParameterTable.vue rename to src/components/workflows/ParameterTable.vue diff --git a/src/components/modals/DeleteExecutionModal.vue b/src/components/workflows/modals/DeleteExecutionModal.vue similarity index 97% rename from src/components/modals/DeleteExecutionModal.vue rename to src/components/workflows/modals/DeleteExecutionModal.vue index 5583509..2e2791e 100644 --- a/src/components/modals/DeleteExecutionModal.vue +++ b/src/components/workflows/modals/DeleteExecutionModal.vue @@ -1,8 +1,8 @@ <script setup lang="ts"> -import DeleteModal from "./DeleteModal.vue"; import type { WorkflowExecutionOut } from "@/client/types.gen.ts"; import dayjs from "dayjs"; import { useNameStore, useUserStore } from "@/stores"; +import DeleteModal from "@/components/modals/DeleteModal.vue"; const props = defineProps<{ modalId: string; diff --git a/src/components/modals/DeleteWorkflowModal.vue b/src/components/workflows/modals/DeleteWorkflowModal.vue similarity index 94% rename from src/components/modals/DeleteWorkflowModal.vue rename to src/components/workflows/modals/DeleteWorkflowModal.vue index 535ef7c..5a51a47 100644 --- a/src/components/modals/DeleteWorkflowModal.vue +++ b/src/components/workflows/modals/DeleteWorkflowModal.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> import type { WorkflowOut } from "@/client/types.gen.ts"; -import DeleteModal from "./DeleteModal.vue"; +import DeleteModal from "@/components/modals/DeleteModal.vue"; const props = defineProps<{ modalId: string; diff --git a/src/components/workflows/modals/ParameterModal.vue b/src/components/workflows/modals/ParameterModal.vue index efe2672..00d2c4b 100644 --- a/src/components/workflows/modals/ParameterModal.vue +++ b/src/components/workflows/modals/ParameterModal.vue @@ -17,7 +17,7 @@ import type { NestedWorkflowParameters, TemporaryParams, } from "@/types/WorkflowParameters"; -import ParameterTable from "@/components/ParameterTable.vue"; +import ParameterTable from "@/components/workflows/ParameterTable.vue"; const nameRepository = useNameStore(); const executionRepository = useWorkflowExecutionStore(); diff --git a/src/views/admin/AdminBucketsView.vue b/src/views/admin/AdminBucketsView.vue index a4f8b67..4e3e137 100644 --- a/src/views/admin/AdminBucketsView.vue +++ b/src/views/admin/AdminBucketsView.vue @@ -9,7 +9,7 @@ import { useNameStore } from "@/stores/names"; import { filesize } from "filesize"; import dayjs from "dayjs"; import UpdateBucketLimitsModal from "@/components/admin/UpdateBucketLimitsModal.vue"; -import DeleteBucketModal from "@/components/modals/DeleteBucketModal.vue"; +import DeleteBucketModal from "@/components/object-storage/modals/DeleteBucketModal.vue"; import CreateOtrModal from "@/components/modals/CreateOtrModal.vue"; const bucketState = reactive<{ @@ -128,7 +128,9 @@ function limitsUpdated(bucket: BucketOut) { <h2>Manage Buckets</h2> </div> <form id="admin-bucket-search-form" @submit.prevent="searchBuckets"> - <div class="d-flex justify-content-evenly align-content-center mb-4"> + <div + class="d-flex justify-content-evenly align-content-center mb-4 column-gap-2 flex-wrap" + > <div class="flex-fill mx-2"> <label for="admin-bucket-name-search" class="form-label" >Name of bucket</label @@ -184,99 +186,105 @@ function limitsUpdated(bucket: BucketOut) { Reset </button> </form> - <table v-if="bucketState.buckets" class="table table-striped align-middle"> - <thead> - <tr> - <th scope="col"><b>Name</b></th> - <th scope="col" class="description-column">Description</th> - <th scope="col">Created at</th> - <th scope="col">Size Quota</th> - <th scope="col">Object Quota</th> - <th scope="col">Owner</th> - <th scope="col"></th> - </tr> - </thead> - <tbody v-if="filteredBuckets.length === 0"> - <tr> - <td colspan="7" class="text-center fst-italic fw-light"> - <template v-if="bucketState.searched" - >No bucket found with specified filters - </template> - <template v-else>Select a filter and search for buckets</template> - </td> - </tr> - </tbody> - <tbody v-else> - <tr v-for="bucket in filteredBuckets" :key="bucket.name"> - <th scope="row">{{ bucket.name }}</th> - <td class="description-column">{{ bucket.description }}</td> - <td> - {{ dayjs.unix(bucket.created_at).format("DD.MM.YYYY HH:mm:ss") }} - </td> - <td> - <span v-if="bucket.size_limit"> - {{ filesize(1024 * bucket.size_limit) }} - </span> - <span v-else>-</span> - </td> - <td> - <span v-if="bucket.object_limit"> - {{ bucket.object_limit }} - </span> - <span v-else>-</span> - </td> - <td>{{ nameRepository.getName(bucket.owner_id) }}</td> - <td> - <div - class="btn-group btn-group-sm dropdown-center dropdown-menu-start" - > - <button - type="button" - class="btn btn-secondary btn-sm" - data-bs-toggle="modal" - :data-bs-target="'#' + updateLimitsModalId" - @click="bucketState.updateLimitsBucket = bucket" - > - Edit quotas - </button> - <button - type="button" - class="btn btn-secondary dropdown-toggle dropdown-toggle-split" - data-bs-toggle="dropdown" - aria-expanded="false" + <div + v-if="bucketState.buckets" + class="overflow-x-auto" + style="max-width: 100vw" + > + <table class="table table-striped align-middle"> + <thead> + <tr> + <th scope="col"><b>Name</b></th> + <th scope="col">Description</th> + <th scope="col">Created at</th> + <th scope="col">Size Quota</th> + <th scope="col">Object Quota</th> + <th scope="col">Owner</th> + <th scope="col"></th> + </tr> + </thead> + <tbody v-if="filteredBuckets.length === 0"> + <tr> + <td colspan="7" class="text-center fst-italic fw-light"> + <template v-if="bucketState.searched" + >No bucket found with specified filters + </template> + <template v-else>Select a filter and search for buckets</template> + </td> + </tr> + </tbody> + <tbody v-else> + <tr v-for="bucket in filteredBuckets" :key="bucket.name"> + <th scope="row">{{ bucket.name }}</th> + <td class="description-column">{{ bucket.description }}</td> + <td> + {{ dayjs.unix(bucket.created_at).format("DD.MM.YYYY HH:mm:ss") }} + </td> + <td> + <span v-if="bucket.size_limit"> + {{ filesize(1024 * bucket.size_limit) }} + </span> + <span v-else>-</span> + </td> + <td> + <span v-if="bucket.object_limit"> + {{ bucket.object_limit }} + </span> + <span v-else>-</span> + </td> + <td>{{ nameRepository.getName(bucket.owner_id) }}</td> + <td> + <div + class="btn-group btn-group-sm dropdown-center dropdown-menu-start" > - <span class="visually-hidden">Toggle Dropdown</span> - </button> - <ul class="dropdown-menu dropdown-menu"> - <li> - <button - class="dropdown-item" - type="button" - data-bs-toggle="modal" - data-bs-target="#create-bucket-otr-modal" - @click="bucketState.selectedBucket = bucket" - > - Transfer ownership - </button> - </li> - <li> - <button - class="dropdown-item text-danger align-middle" - type="button" - data-bs-toggle="modal" - data-bs-target="#delete-bucket-modal" - @click="bucketState.selectedBucket = bucket" - > - <font-awesome-icon icon="fa-solid fa-trash" /> - <span class="ms-1">Delete</span> - </button> - </li> - </ul> - </div> - </td> - </tr> - </tbody> - </table> + <button + type="button" + class="btn btn-secondary btn-sm" + data-bs-toggle="modal" + :data-bs-target="'#' + updateLimitsModalId" + @click="bucketState.updateLimitsBucket = bucket" + > + Edit quotas + </button> + <button + type="button" + class="btn btn-secondary dropdown-toggle dropdown-toggle-split" + data-bs-toggle="dropdown" + aria-expanded="false" + > + <span class="visually-hidden">Toggle Dropdown</span> + </button> + <ul class="dropdown-menu dropdown-menu"> + <li> + <button + class="dropdown-item" + type="button" + data-bs-toggle="modal" + data-bs-target="#create-bucket-otr-modal" + @click="bucketState.selectedBucket = bucket" + > + Transfer ownership + </button> + </li> + <li> + <button + class="dropdown-item text-danger align-middle" + type="button" + data-bs-toggle="modal" + data-bs-target="#delete-bucket-modal" + @click="bucketState.selectedBucket = bucket" + > + <font-awesome-icon icon="fa-solid fa-trash" /> + <span class="ms-1">Delete</span> + </button> + </li> + </ul> + </div> + </td> + </tr> + </tbody> + </table> + </div> </template> <style scoped> diff --git a/src/views/admin/AdminResourcesView.vue b/src/views/admin/AdminResourcesView.vue index d519e64..27f2ee8 100644 --- a/src/views/admin/AdminResourcesView.vue +++ b/src/views/admin/AdminResourcesView.vue @@ -12,7 +12,7 @@ import { useNameStore } from "@/stores/names"; import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; import dayjs from "dayjs"; import ResourceVersionInfoModal from "@/components/resources/modals/ResourceVersionInfoModal.vue"; -import DeleteResourceModal from "@/components/modals/DeleteResourceModal.vue"; +import DeleteResourceModal from "@/components/resources/modals/DeleteResourceModal.vue"; import CreateOtrModal from "@/components/modals/CreateOtrModal.vue"; const resourceRepository = useResourceStore(); @@ -177,8 +177,10 @@ function resetForm() { <h2>Manage Resources</h2> </div> <form id="admin-resource-search-form" @submit.prevent="searchResources"> - <div class="d-flex justify-content-evenly align-content-center"> - <div class="mx-2"> + <div + class="d-flex justify-content-evenly align-content-center flex-wrap column-gap-2 mb-2" + > + <div> <label for="admin-resource-state-select" class="form-label" >Status of Resource Versions</label > @@ -186,7 +188,7 @@ function resetForm() { id="admin-resource-state-select" v-model="resourceState.resourceStatus" multiple - class="form-select mb-4 w-fit" + class="form-select w-fit" > <option v-for="state in Object.values(ResourceVersionStatus)" @@ -196,7 +198,7 @@ function resetForm() { </option> </select> </div> - <div class="flex-fill mx-2"> + <div class="flex-fill"> <label for="admin-resource-name-search" class="form-label" >Name of the Resource</label > @@ -214,7 +216,7 @@ function resetForm() { /> </div> </div> - <div class="flex-fill mx-2"> + <div class="flex-fill"> <label for="admin-resource-user-search" class="form-label" >Name of the Maintainer</label > @@ -251,226 +253,235 @@ function resetForm() { Reset </button> </form> - <table v-if="resourceState.resources" class="table table-striped"> - <thead> - <tr> - <th scope="col"><b>Name</b></th> - <th scope="col">Resource ID</th> - <th scope="col">Source</th> - <th scope="col">Maintainer</th> - <th scope="col"></th> - </tr> - </thead> - <tbody v-if="resourceState.resources.length === 0"> - <tr> - <td colspan="5" class="text-center fst-italic fw-light"> - <template v-if="resourceState.searched" - >No resource found with specified filters - </template> - <template v-else>Select a filter and search for Resources</template> - </td> - </tr> - </tbody> - <tbody v-else> - <template - v-for="resource in resourceState.resources" - :key="resource.resource_id" - > + <div + v-if="resourceState.resources" + class="overflow-x-auto" + style="max-width: 100vw" + > + <table class="table table-striped"> + <thead> <tr> - <th scope="row">{{ resource.name }}</th> - <td>{{ resource.resource_id }}</td> - <td>{{ resource.source }}</td> - <td>{{ nameRepository.getName(resource.maintainer_id) }}</td> - <td class="text-end"> - <button - class="btn btn-secondary dropdown-toggle" - type="button" - data-bs-toggle="dropdown" - aria-expanded="false" - > - Actions - </button> - <ul class="dropdown-menu"> - <li> - <button - class="dropdown-item" - type="button" - data-bs-toggle="modal" - data-bs-target="#create-resource-otr-modal" - @click="resourceState.selectedResource = resource" - > - Transfer ownership - </button> - </li> - <li> - <button - class="dropdown-item text-danger align-middle" - type="button" - data-bs-toggle="modal" - data-bs-target="#delete-resource-modal" - @click="resourceState.selectedResource = resource" - > - <font-awesome-icon icon="fa-solid fa-trash" /> - <span class="ms-1">Delete</span> - </button> - </li> - </ul> - </td> + <th scope="col"><b>Name</b></th> + <th scope="col">Resource ID</th> + <th scope="col">Source</th> + <th scope="col">Maintainer</th> + <th scope="col"></th> </tr> + </thead> + <tbody v-if="resourceState.resources.length === 0"> <tr> - <td colspan="5"> - <table class="table mb-0 table-hover"> - <thead> - <tr> - <th scope="col"><b>Release</b></th> - <th scope="col">Version ID</th> - <th scope="col">Created At</th> - <th scope="col">State</th> - <th scope="col" class="text-end">Action</th> - </tr> - </thead> - <tbody> - <tr - v-for="(version, index) in resource.versions" - :key="version.resource_version_id" - > - <th scope="row">{{ version.release }}</th> - <th>{{ version.resource_version_id }}</th> - <th> - {{ - dayjs - .unix(version.created_at) - .format("DD.MM.YYYY HH:mm:ss") - }} - </th> - <th>{{ version.status }}</th> - <th class="text-end"> - <div class="btn-group"> - <button - type="button" - class="btn btn-secondary" - data-bs-toggle="modal" - data-bs-target="#admin-resource-version-info-modal" - @click=" - resourceState.inspectResource = resource; - resourceState.inspectVersionIndex = index; - " - > - Inspect - </button> - <button - type="button" - class="btn btn-secondary dropdown-toggle dropdown-toggle-split" - data-bs-toggle="dropdown" - aria-expanded="false" - :disabled="resourceState.loading" - > - <span class="visually-hidden">Toggle Dropdown</span> - </button> - <ul class="dropdown-menu"> - <li - v-if=" - version.status === - ResourceVersionStatus.SYNCHRONIZED + <td colspan="5" class="text-center fst-italic fw-light"> + <template v-if="resourceState.searched" + >No resource found with specified filters + </template> + <template v-else>Select a filter and search for Resources</template> + </td> + </tr> + </tbody> + <tbody v-else> + <template + v-for="resource in resourceState.resources" + :key="resource.resource_id" + > + <tr> + <th scope="row">{{ resource.name }}</th> + <td>{{ resource.resource_id }}</td> + <td>{{ resource.source }}</td> + <td>{{ nameRepository.getName(resource.maintainer_id) }}</td> + <td class="text-end"> + <button + class="btn btn-secondary dropdown-toggle" + type="button" + data-bs-toggle="dropdown" + aria-expanded="false" + > + Actions + </button> + <ul class="dropdown-menu"> + <li> + <button + class="dropdown-item" + type="button" + data-bs-toggle="modal" + data-bs-target="#create-resource-otr-modal" + @click="resourceState.selectedResource = resource" + > + Transfer ownership + </button> + </li> + <li> + <button + class="dropdown-item text-danger align-middle" + type="button" + data-bs-toggle="modal" + data-bs-target="#delete-resource-modal" + @click="resourceState.selectedResource = resource" + > + <font-awesome-icon icon="fa-solid fa-trash" /> + <span class="ms-1">Delete</span> + </button> + </li> + </ul> + </td> + </tr> + <tr> + <td colspan="5"> + <table class="table mb-0 table-hover"> + <thead> + <tr> + <th scope="col"><b>Release</b></th> + <th scope="col">Version ID</th> + <th scope="col">Created At</th> + <th scope="col">State</th> + <th scope="col" class="text-end">Action</th> + </tr> + </thead> + <tbody> + <tr + v-for="(version, index) in resource.versions" + :key="version.resource_version_id" + > + <th scope="row">{{ version.release }}</th> + <th>{{ version.resource_version_id }}</th> + <th> + {{ + dayjs + .unix(version.created_at) + .format("DD.MM.YYYY HH:mm:ss") + }} + </th> + <th>{{ version.status }}</th> + <th class="text-end"> + <div class="btn-group"> + <button + type="button" + class="btn btn-secondary" + data-bs-toggle="modal" + data-bs-target="#admin-resource-version-info-modal" + @click=" + resourceState.inspectResource = resource; + resourceState.inspectVersionIndex = index; " > - <button - class="dropdown-item" - type="button" - @click="setLatest(version)" - > - Set to Latest - </button> - </li> - <li - v-if=" - version.status === - ResourceVersionStatus.WAIT_FOR_REVIEW - " + Inspect + </button> + <button + type="button" + class="btn btn-secondary dropdown-toggle dropdown-toggle-split" + data-bs-toggle="dropdown" + aria-expanded="false" + :disabled="resourceState.loading" > - <router-link - class="dropdown-item" - :to="{ name: 'resource-review' }" + <span class="visually-hidden">Toggle Dropdown</span> + </button> + <ul class="dropdown-menu"> + <li + v-if=" + version.status === + ResourceVersionStatus.SYNCHRONIZED + " > - Review Resource - </router-link> - </li> - <li - v-if=" - version.status === - ResourceVersionStatus.SYNC_REQUESTED - " - > - <router-link - class="dropdown-item" - :to="{ name: 'admin-sync-requests' }" + <button + class="dropdown-item" + type="button" + @click="setLatest(version)" + > + Set to Latest + </button> + </li> + <li + v-if=" + version.status === + ResourceVersionStatus.WAIT_FOR_REVIEW + " > - Review sync request - </router-link> - </li> - <li - v-if=" - version.status === ResourceVersionStatus.APPROVED || - version.status === ResourceVersionStatus.SYNC_ERROR - " - > - <button - class="dropdown-item" - type="button" - @click="syncToCluster(version)" + <router-link + class="dropdown-item" + :to="{ name: 'resource-review' }" + > + Review Resource + </router-link> + </li> + <li + v-if=" + version.status === + ResourceVersionStatus.SYNC_REQUESTED + " > - <font-awesome-icon - icon="fa-solid fa-cloud-arrow-down" - /> - <span class="ms-1">Sync to Cluster</span> - </button> - </li> - <li - v-if=" - version.status === - ResourceVersionStatus.SYNCHRONIZED || - version.status === - ResourceVersionStatus.CLUSTER_DELETE_ERROR || - version.status === ResourceVersionStatus.LATEST - " - > - <button - class="dropdown-item text-danger align-middle" - type="button" - @click="deleteOnCluster(version)" + <router-link + class="dropdown-item" + :to="{ name: 'admin-sync-requests' }" + > + Review sync request + </router-link> + </li> + <li + v-if=" + version.status === + ResourceVersionStatus.APPROVED || + version.status === + ResourceVersionStatus.SYNC_ERROR + " > - <font-awesome-icon icon="fa-solid fa-trash" /> - <span class="ms-1">Delete on Cluster</span> - </button> - </li> - <li - v-if=" - version.status === ResourceVersionStatus.APPROVED || - version.status === - ResourceVersionStatus.S3_DELETE_ERROR || - version.status === ResourceVersionStatus.DENIED - " - > - <button - class="dropdown-item text-danger align-middle" - type="button" - @click="deleteInS3(version)" + <button + class="dropdown-item" + type="button" + @click="syncToCluster(version)" + > + <font-awesome-icon + icon="fa-solid fa-cloud-arrow-down" + /> + <span class="ms-1">Sync to Cluster</span> + </button> + </li> + <li + v-if=" + version.status === + ResourceVersionStatus.SYNCHRONIZED || + version.status === + ResourceVersionStatus.CLUSTER_DELETE_ERROR || + version.status === ResourceVersionStatus.LATEST + " > - <font-awesome-icon icon="fa-solid fa-trash" /> - <span class="ms-1">Delete in S3</span> - </button> - </li> - </ul> - </div> - </th> - </tr> - </tbody> - </table> - </td> - </tr> - </template> - </tbody> - </table> + <button + class="dropdown-item text-danger align-middle" + type="button" + @click="deleteOnCluster(version)" + > + <font-awesome-icon icon="fa-solid fa-trash" /> + <span class="ms-1">Delete on Cluster</span> + </button> + </li> + <li + v-if=" + version.status === + ResourceVersionStatus.APPROVED || + version.status === + ResourceVersionStatus.S3_DELETE_ERROR || + version.status === ResourceVersionStatus.DENIED + " + > + <button + class="dropdown-item text-danger align-middle" + type="button" + @click="deleteInS3(version)" + > + <font-awesome-icon icon="fa-solid fa-trash" /> + <span class="ms-1">Delete in S3</span> + </button> + </li> + </ul> + </div> + </th> + </tr> + </tbody> + </table> + </td> + </tr> + </template> + </tbody> + </table> + </div> </template> <style scoped></style> diff --git a/src/views/admin/AdminSyncRequestsView.vue b/src/views/admin/AdminSyncRequestsView.vue index f879dc9..92dda33 100644 --- a/src/views/admin/AdminSyncRequestsView.vue +++ b/src/views/admin/AdminSyncRequestsView.vue @@ -164,19 +164,19 @@ onMounted(() => { </template> </reason-modal> <div - class="row border-bottom mb-4 justify-content-between align-items-center" + class="d-flex border-bottom mb-4 justify-content-between align-items-center flex-wrap gap-2" > <h2 class="w-fit">Review resource synchronization requests</h2> <span id="refreshReviewableResourcesButton" - class="w-fit" + class="w-fit mb-2" tabindex="0" data-bs-title="Refresh Reviewable Resources" data-bs-toggle="tooltip" > <button type="button" - class="btn me-2 shadow-sm border w-fit" + class="btn shadow-sm border w-fit" :class="{ 'btn-light': settingsStore.lightThemeActive, 'btn-secondary': settingsStore.darkThemeActive, diff --git a/src/views/admin/AdminUsersView.vue b/src/views/admin/AdminUsersView.vue index 4969d38..8d856a3 100644 --- a/src/views/admin/AdminUsersView.vue +++ b/src/views/admin/AdminUsersView.vue @@ -129,8 +129,10 @@ onMounted(() => { </button> </div> <form id="admin-user-search-form" @submit.prevent="searchUsers"> - <div class="d-flex justify-content-evenly align-content-center"> - <div class="mx-2"> + <div + class="d-flex justify-content-evenly align-content-center column-gap-3 flex-wrap mb-2" + > + <div> <label for="admin-user-state-select" class="form-label" >User Roles</label > @@ -138,14 +140,14 @@ onMounted(() => { id="admin-user-state-select" v-model="userState.userRoles" multiple - class="form-select mb-4 w-fit" + class="form-select w-fit" > <option v-for="role in Object.values(RoleEnum)" :key="role"> {{ role }} </option> </select> </div> - <div class="flex-fill mx-2"> + <div class="flex-fill"> <label for="admin-user-name-search" class="form-label" >Name of a user</label > @@ -173,141 +175,140 @@ onMounted(() => { Search </button> </form> - <table - v-if="userState.users" - class="table table-striped align-middle caption-top" - > - <caption> - Displaying - {{ - userState.users.length - }} - Users - </caption> - <thead> - <tr> - <th scope="col"><b>Name</b></th> - <th scope="col">UID</th> - <th scope="col">Email</th> - <th - v-for="role in Object.values(RoleEnum)" - :key="role" - scope="col" - class="text-center" - > - {{ role.toUpperCase() }} - </th> - <th scope="col"></th> - </tr> - </thead> - <tbody v-if="userState.users.length === 0"> - <tr> - <td colspan="9" class="text-center fst-italic fw-light"> - <template v-if="userState.searched" - >No Users found with specified filters - </template> - <template v-else>Select a filter and search for Users</template> - </td> - </tr> - </tbody> - <tbody v-else> - <tr v-for="(user, index) in userState.users" :key="user.uid"> - <th scope="row"> - <img - :src="user.gravatar_url + '?d=mp&s=32'" - class="rounded-circle" - height="32" - width="32" - alt="profile picture" - /> - <span class="ms-2">{{ user.display_name }}</span> - </th> - <td>{{ user.uid }}</td> - <td> - <a v-if="user.email" :href="`mailto:${user.email}`">{{ - user.email - }}</a> - </td> - <td - v-for="role in Object.values(RoleEnum)" - :key="role" - class="text-center" - > - <input - v-model="userState.newUserRoles[index]" - type="checkbox" - class="form-check-input" - :value="role" - :disabled="!userState.editUserRoles[index]" - /> - </td> - <td v-if="userState.editUserRoles[index]" class="text-end"> - <div - class="btn-group btn-group-sm" - role="group" - aria-label="Basic mixed styles example" + <div v-if="userState.users" class="overflow-x-auto" style="max-width: 100vw"> + <table class="table table-striped align-middle caption-top"> + <caption> + Displaying + {{ + userState.users.length + }} + Users + </caption> + <thead> + <tr> + <th scope="col"><b>Name</b></th> + <th scope="col">UID</th> + <th scope="col">Email</th> + <th + v-for="role in Object.values(RoleEnum)" + :key="role" + scope="col" + class="text-center" > - <button - type="button" - class="btn btn-success" - :disabled="userState.loading" - @click="saveUserRoles(index)" - > - Save - </button> - <button - type="button" - class="btn btn-danger" - :disabled="userState.loading" - @click="resetUserRoles(index)" - > - Cancel - </button> - </div> - </td> - <td v-else class="text-end"> - <div class="btn-group"> - <button - type="button" - class="btn btn-sm btn-secondary" - @click="userState.editUserRoles[index] = true" - > - Edit Roles - </button> - <button - type="button" - class="btn btn-secondary btn-sm dropdown-toggle dropdown-toggle-split" - data-bs-toggle="dropdown" - aria-expanded="false" + {{ role.toUpperCase() }} + </th> + <th scope="col"></th> + </tr> + </thead> + <tbody v-if="userState.users.length === 0"> + <tr> + <td colspan="9" class="text-center fst-italic fw-light"> + <template v-if="userState.searched" + >No Users found with specified filters + </template> + <template v-else>Select a filter and search for Users</template> + </td> + </tr> + </tbody> + <tbody v-else> + <tr v-for="(user, index) in userState.users" :key="user.uid"> + <th scope="row"> + <img + :src="user.gravatar_url + '?d=mp&s=32'" + class="rounded-circle" + height="32" + width="32" + alt="profile picture" + /> + <span class="ms-2">{{ user.display_name }}</span> + </th> + <td>{{ user.uid }}</td> + <td> + <a v-if="user.email" :href="`mailto:${user.email}`">{{ + user.email + }}</a> + </td> + <td + v-for="role in Object.values(RoleEnum)" + :key="role" + class="text-center" + > + <input + v-model="userState.newUserRoles[index]" + type="checkbox" + class="form-check-input" + :value="role" + :disabled="!userState.editUserRoles[index]" + /> + </td> + <td v-if="userState.editUserRoles[index]" class="text-end"> + <div + class="btn-group btn-group-sm" + role="group" + aria-label="Basic mixed styles example" > - <span class="visually-hidden">Toggle Dropdown</span> - </button> - <ul class="dropdown-menu"> - <li> - <a - v-if="user.invitation_token_created_at" - class="dropdown-item" - :class="{ disabled: userState.loading }" - :aria-disabled="userState.loading" - @click="resendInvitationEmail(user.uid)" - >Resend invitation email</a - > - </li> - <li> - <a - class="dropdown-item text-danger disabled" - aria-disabled="true" - > - <font-awesome-icon icon="fa-solid fa-trash" class="me-1" /> - Delete</a - > - </li> - </ul> - </div> - </td> - </tr> - </tbody> - </table> + <button + type="button" + class="btn btn-success" + :disabled="userState.loading" + @click="saveUserRoles(index)" + > + Save + </button> + <button + type="button" + class="btn btn-danger" + :disabled="userState.loading" + @click="resetUserRoles(index)" + > + Cancel + </button> + </div> + </td> + <td v-else class="text-end"> + <div class="btn-group"> + <button + type="button" + class="btn btn-sm btn-secondary" + @click="userState.editUserRoles[index] = true" + > + Edit Roles + </button> + <button + type="button" + class="btn btn-secondary btn-sm dropdown-toggle dropdown-toggle-split" + data-bs-toggle="dropdown" + aria-expanded="false" + > + <span class="visually-hidden">Toggle Dropdown</span> + </button> + <ul class="dropdown-menu"> + <li> + <a + v-if="user.invitation_token_created_at" + class="dropdown-item" + :class="{ disabled: userState.loading }" + :aria-disabled="userState.loading" + @click="resendInvitationEmail(user.uid)" + >Resend invitation email</a + > + </li> + <li> + <a + class="dropdown-item text-danger disabled" + aria-disabled="true" + > + <font-awesome-icon icon="fa-solid fa-trash" class="me-1" /> + Delete</a + > + </li> + </ul> + </div> + </td> + </tr> + </tbody> + </table> + </div> </template> <style scoped></style> diff --git a/src/views/admin/AdminWorkflowExecutionView.vue b/src/views/admin/AdminWorkflowExecutionView.vue index 4e4a4bd..347c18d 100644 --- a/src/views/admin/AdminWorkflowExecutionView.vue +++ b/src/views/admin/AdminWorkflowExecutionView.vue @@ -15,7 +15,7 @@ import { useNameStore } from "@/stores/names"; import dayjs from "dayjs"; import ParameterModal from "@/components/workflows/modals/ParameterModal.vue"; import MarkdownRenderer from "@/components/MarkdownRenderer.vue"; -import DeleteExecutionModal from "@/components/modals/DeleteExecutionModal.vue"; +import DeleteExecutionModal from "@/components/workflows/modals/DeleteExecutionModal.vue"; const executionRepository = useWorkflowExecutionStore(); const nameRepository = useNameStore(); @@ -216,8 +216,10 @@ onMounted(() => { <h2>Search Workflow Execution</h2> </div> <form id="admin-execution-search-form" @submit.prevent="searchExecution"> - <div class="d-flex justify-content-evenly align-content-center mb-4"> - <div class="mx-2"> + <div + class="d-flex justify-content-evenly align-content-center mb-4 column-gap-2 flex-wrap" + > + <div> <label for="admin-execution-state-select" class="form-label" >Status of Workflow Execution</label > @@ -258,7 +260,7 @@ onMounted(() => { <label class="form-check-label" for="sort-radio-desc"> Desc </label> </div> </div> - <div class="flex-fill mx-2"> + <div class="flex-fill"> <label for="admin-execution-start-after-search" class="form-label" >Start after</label > @@ -306,7 +308,7 @@ onMounted(() => { /> </div> </div> - <div class="flex-fill mx-2"> + <div class="flex-fill"> <label for="admin-execution-user-search" class="form-label" >Name of the owner</label > diff --git a/src/views/object-storage/BucketView.vue b/src/views/object-storage/BucketView.vue index 29d3f77..aa4f08f 100644 --- a/src/views/object-storage/BucketView.vue +++ b/src/views/object-storage/BucketView.vue @@ -24,7 +24,7 @@ import BootstrapToast from "@/components/BootstrapToast.vue"; import { useSettingsStore } from "@/stores/settings"; import { md5 } from "@/utils/md5"; import DownloadObjectsModal from "@/components/object-storage/modals/DownloadObjectsModal.vue"; -import DeleteObjectsModal from "@/components/modals/DeleteObjectsModal.vue"; +import DeleteObjectsModal from "@/components/object-storage/modals/DeleteObjectsModal.vue"; const authStore = useUserStore(); const bucketRepository = useBucketStore(); diff --git a/src/views/object-storage/BucketsView.vue b/src/views/object-storage/BucketsView.vue index 208b713..7e99e98 100644 --- a/src/views/object-storage/BucketsView.vue +++ b/src/views/object-storage/BucketsView.vue @@ -17,7 +17,7 @@ import { useOTRStore } from "@/stores/otrs"; import BucketDetailModal from "@/components/object-storage/modals/BucketDetailModal.vue"; import ListOtrsModal from "@/components/modals/ListOtrsModal.vue"; import OtrModal from "@/components/modals/ShowOtrModal.vue"; -import DeleteBucketModal from "@/components/modals/DeleteBucketModal.vue"; +import DeleteBucketModal from "@/components/object-storage/modals/DeleteBucketModal.vue"; const router = useRouter(); const bucketRepository = useBucketStore(); diff --git a/src/views/object-storage/S3KeyView.vue b/src/views/object-storage/S3KeyView.vue index 8c29c38..42c3e5d 100644 --- a/src/views/object-storage/S3KeyView.vue +++ b/src/views/object-storage/S3KeyView.vue @@ -4,7 +4,7 @@ import { ref, watch } from "vue"; import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; import { environment } from "@/environment"; import CopyToClipboardIcon from "@/components/CopyToClipboardIcon.vue"; -import DeleteS3KeyModal from "@/components/modals/DeleteS3KeyModal.vue"; +import DeleteS3KeyModal from "@/components/object-storage/modals/DeleteS3KeyModal.vue"; const props = defineProps<{ s3key: S3Key; diff --git a/src/views/resources/MyResourcesView.vue b/src/views/resources/MyResourcesView.vue index d5d12c0..48ab7e7 100644 --- a/src/views/resources/MyResourcesView.vue +++ b/src/views/resources/MyResourcesView.vue @@ -23,7 +23,7 @@ import ListOtrsModal from "@/components/modals/ListOtrsModal.vue"; import { useOTRStore } from "@/stores/otrs"; import { useUserStore } from "@/stores/users"; import { useSettingsStore } from "@/stores/settings"; -import DeleteResourceModal from "@/components/modals/DeleteResourceModal.vue"; +import DeleteResourceModal from "@/components/resources/modals/DeleteResourceModal.vue"; const resourceRepository = useResourceStore(); const s3KeyRepository = useS3KeyStore(); diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue index aefd1be..7cf5544 100644 --- a/src/views/user/ProfileView.vue +++ b/src/views/user/ProfileView.vue @@ -70,7 +70,7 @@ onMounted(() => { :user="userRepository.user ?? { display_name: '', uid: '' }" @confirm-delete="deleteCurrentUser" /> - <div class="row border-bottom mb-4"> + <div class="border-bottom mb-4"> <h2 class="mb-2">My Profile</h2> </div> <div class="px-1"> @@ -93,7 +93,7 @@ onMounted(() => { </div> </div> <div> - <div class="row border-bottom mb-2 mt-4"> + <div class="border-bottom mb-2 mt-4"> <h3>My linked accounts</h3> </div> <div> @@ -111,7 +111,7 @@ onMounted(() => { <div v-if="userRepository.user?.lifescience_id"> <b>Linked account: </b> <a href="https://profile.aai.lifescience-ri.eu/profile" - >{{ userRepository.user?.lifescience_id }}@lifescience.eu</a + >{{ userRepository.user?.lifescience_id }}​@lifescience.eu</a > </div> <div v-else> @@ -140,7 +140,7 @@ onMounted(() => { </p> <div v-if="userRepository.user?.nfdi_id"> <b>Linked account: </b - >{{ userRepository.user?.nfdi_id }}@lifescience.eu + >{{ userRepository.user?.nfdi_id }}​@lifescience.eu </div> <div v-else> <div>Link your account with NFDI AAI</div> @@ -158,7 +158,7 @@ onMounted(() => { </div> </div> <div> - <div class="row border-bottom mb-2 mt-4"> + <div class="border-bottom mb-2 mt-4"> <h3>My roles</h3> </div> <p> @@ -272,7 +272,7 @@ onMounted(() => { </div> </div> <div> - <div class="row border-bottom mb-2 mt-4"> + <div class="border-bottom mb-2 mt-4"> <h3 class="text-danger">Delete my account</h3> </div> <p> diff --git a/src/views/workflows/ListWorkflowExecutionsView.vue b/src/views/workflows/ListWorkflowExecutionsView.vue index 1dbe0ee..c48260a 100644 --- a/src/views/workflows/ListWorkflowExecutionsView.vue +++ b/src/views/workflows/ListWorkflowExecutionsView.vue @@ -11,7 +11,7 @@ import { ExponentialBackoff } from "@/utils/BackoffStrategy"; import { useNameStore } from "@/stores/names"; import MarkdownRenderer from "@/components/MarkdownRenderer.vue"; import { useSettingsStore } from "@/stores/settings"; -import DeleteExecutionModal from "@/components/modals/DeleteExecutionModal.vue"; +import DeleteExecutionModal from "@/components/workflows/modals/DeleteExecutionModal.vue"; const workflowRepository = useWorkflowStore(); const nameRepository = useNameStore(); diff --git a/src/views/workflows/MyWorkflowsView.vue b/src/views/workflows/MyWorkflowsView.vue index 9ea093c..1ff6383 100644 --- a/src/views/workflows/MyWorkflowsView.vue +++ b/src/views/workflows/MyWorkflowsView.vue @@ -27,7 +27,7 @@ import { useUserStore } from "@/stores/users"; import { Modal, Tooltip } from "bootstrap"; import { useSettingsStore } from "@/stores/settings"; import CreateOtrModal from "@/components/modals/CreateOtrModal.vue"; -import DeleteWorkflowModal from "@/components/modals/DeleteWorkflowModal.vue"; +import DeleteWorkflowModal from "@/components/workflows/modals/DeleteWorkflowModal.vue"; const workflowRepository = useWorkflowStore(); const workflowExecutionRepository = useWorkflowExecutionStore(); -- GitLab From c8094cd17f5543fc97c5c424b249b07696b60d31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Wed, 12 Feb 2025 09:27:48 +0000 Subject: [PATCH 14/25] Delete any account as admin #191 --- src/views/admin/AdminUsersView.vue | 40 ++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/src/views/admin/AdminUsersView.vue b/src/views/admin/AdminUsersView.vue index 8d856a3..b62f506 100644 --- a/src/views/admin/AdminUsersView.vue +++ b/src/views/admin/AdminUsersView.vue @@ -1,11 +1,16 @@ <script setup lang="ts"> import { useUserStore } from "@/stores/users"; import { onMounted, reactive } from "vue"; -import { RoleEnum, type UserOutExtended } from "@/client/types.gen"; +import { + RoleEnum, + type UserOutExtended, + type UserOut, +} from "@/client/types.gen"; import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; import BootstrapToast from "@/components/BootstrapToast.vue"; import { Toast } from "bootstrap"; import CreateUserModal from "@/components/admin/CreateUserModal.vue"; +import DeleteUserModal from "@/components/modals/DeleteUserModal.vue"; const userRepository = useUserStore(); type RoleList = RoleEnum[]; @@ -24,6 +29,7 @@ const userState = reactive<{ userRoles: RoleEnum[]; inspectUser?: UserOutExtended; searched: boolean; + selectedUser?: UserOut; }>({ loading: false, users: [], @@ -35,6 +41,7 @@ const userState = reactive<{ userRoles: [], inspectUser: undefined, searched: false, + selectedUser: undefined, }); function searchUsers() { @@ -93,6 +100,17 @@ function resendInvitationEmail(uid: string) { }); } +function deleteUser(uid: string) { + userRepository + .deleteUser(uid) + .then(() => { + userState.users = userState.users.filter((user) => user.uid !== uid); + }) + .finally(() => { + userState.selectedUser = undefined; + }); +} + onMounted(() => { successRoleToast = new Toast("#change-role-success-toast"); successInvitationToast = new Toast("#resend-invitation-success-toast"); @@ -114,6 +132,11 @@ onMounted(() => { </template> <template #body>Error: {{ userState.errorMessage }}</template> </bootstrap-toast> + <delete-user-modal + modal-id="delete-user-modal" + :user="userState.selectedUser ?? { display_name: '', uid: '' }" + @confirm-delete="deleteUser" + /> <create-user-modal modal-id="create-user-modal" /> <div class="row border-bottom mb-4 justify-content-between align-items-center pb-2 pe-2" @@ -293,14 +316,17 @@ onMounted(() => { >Resend invitation email</a > </li> - <li> - <a - class="dropdown-item text-danger disabled" - aria-disabled="true" + <li v-if="user.uid !== userRepository.currentUID"> + <button + type="button" + class="dropdown-item text-danger align-middle" + data-bs-toggle="modal" + data-bs-target="#delete-user-modal" + @click="userState.selectedUser = user" > <font-awesome-icon icon="fa-solid fa-trash" class="me-1" /> - Delete</a - > + Delete + </button> </li> </ul> </div> -- GitLab From 9952d421ed6466ac76116f7e189c298d4c963ffe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Wed, 12 Feb 2025 10:59:24 +0000 Subject: [PATCH 15/25] Add Vue dev tools and update robots.txt #191 --- .gitignore | 1 + package-lock.json | 1416 ++++++++++++++++++++++++++++++++++++++++++++- package.json | 3 +- public/robots.txt | 4 + vite.config.ts | 2 + 5 files changed, 1408 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index dec6fc7..4ee9e22 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,4 @@ coverage .env public/env.js +public/google*.html diff --git a/package-lock.json b/package-lock.json index ece13c4..681e9fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,9 +57,34 @@ "typescript": "~5.7.0", "vite": "~6.1.0", "vite-plugin-node-polyfills": "^0.23.0", + "vite-plugin-vue-devtools": "^7.7.0", "vue-tsc": "~2.2.0" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", + "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/@aws-crypto/crc32": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", @@ -1028,6 +1053,263 @@ "node": ">=18.0.0" } }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.8.tgz", + "integrity": "sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.7", + "@babel/parser": "^7.26.8", + "@babel/template": "^7.26.8", + "@babel/traverse": "^7.26.8", + "@babel/types": "^7.26.8", + "@types/gensync": "^1.0.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz", + "integrity": "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.8", + "@babel/types": "^7.26.8", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", @@ -1046,6 +1328,30 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", + "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/parser": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", @@ -1061,6 +1367,165 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz", + "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-decorators": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", + "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.8.tgz", + "integrity": "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz", + "integrity": "sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.8", + "@babel/types": "^7.26.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz", + "integrity": "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.8", + "@babel/parser": "^7.26.8", + "@babel/template": "^7.26.8", + "@babel/types": "^7.26.8", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", @@ -1847,12 +2312,58 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "license": "MIT" }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", @@ -2227,6 +2738,13 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@polka/url": { + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", + "dev": true, + "license": "MIT" + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2569,6 +3087,26 @@ "dev": true, "license": "MIT" }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@smithy/abort-controller": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.1.tgz", @@ -3320,6 +3858,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/gensync": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.4.tgz", + "integrity": "sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/hammerjs": { "version": "2.0.46", "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz", @@ -3614,6 +4159,57 @@ "vscode-uri": "^3.0.8" } }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.5.tgz", + "integrity": "sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.5.tgz", + "integrity": "sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.6", + "@babel/types": "^7.25.6", + "@vue/babel-helper-vue-transform-on": "1.2.5", + "@vue/babel-plugin-resolve-type": "1.2.5", + "html-tags": "^3.3.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.5.tgz", + "integrity": "sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/parser": "^7.25.6", + "@vue/compiler-sfc": "^3.5.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@vue/compiler-core": { "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", @@ -3664,25 +4260,69 @@ "@vue/shared": "3.5.13" } }, - "node_modules/@vue/compiler-vue2": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", - "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.1.tgz", + "integrity": "sha512-Cexc8GimowoDkJ6eNelOPdYIzsu2mgNyp0scOQ3tiaYSb9iok6LOESSsJvHaI+ib3joRfqRJNLkHFjhNuWA5dg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.1" + } + }, + "node_modules/@vue/devtools-core": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.7.1.tgz", + "integrity": "sha512-W4CRrSZJodNIfrPO7/dXF6ZS0QyOY6PCYVhpSoTSx9+nh2wpZxcS1482lAdKM0FTlaoApHV6jXT95Me90hSaBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.1", + "@vue/devtools-shared": "^7.7.1", + "mitt": "^3.0.1", + "nanoid": "^5.0.9", + "pathe": "^2.0.2", + "vite-hot-client": "^0.2.4" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-core/node_modules/nanoid": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" } }, - "node_modules/@vue/devtools-api": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.1.tgz", - "integrity": "sha512-Cexc8GimowoDkJ6eNelOPdYIzsu2mgNyp0scOQ3tiaYSb9iok6LOESSsJvHaI+ib3joRfqRJNLkHFjhNuWA5dg==", - "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^7.7.1" - } + "node_modules/@vue/devtools-core/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" }, "node_modules/@vue/devtools-kit": { "version": "7.7.1", @@ -4222,6 +4862,39 @@ "pako": "~1.0.5" } }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/buffer": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", @@ -4246,6 +4919,22 @@ "dev": true, "license": "MIT" }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/c12": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/c12/-/c12-2.0.1.tgz", @@ -4333,6 +5022,27 @@ "node": ">=6" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001699", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", + "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4505,6 +5215,13 @@ "dev": true, "license": "MIT" }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, "node_modules/copy-anything": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", @@ -4680,6 +5397,36 @@ "dev": true, "license": "MIT" }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -4698,6 +5445,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", @@ -4833,6 +5593,13 @@ "node": ">= 0.4" } }, + "node_modules/electron-to-chromium": { + "version": "1.5.97", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.97.tgz", + "integrity": "sha512-HKLtaH02augM7ZOdYRuO19rWDeY+QSJ1VxnXFa/XDFLf07HvM90pALIJFgrO+UVaajI3+aJMMpojoUTLZyQ7JQ==", + "dev": true, + "license": "ISC" + }, "node_modules/elliptic": { "version": "6.6.1", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", @@ -4868,6 +5635,16 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/error-stack-parser-es": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz", + "integrity": "sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -4939,6 +5716,16 @@ "@esbuild/win32-x64": "0.24.2" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -5289,6 +6076,33 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/execa": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.5.2.tgz", + "integrity": "sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.3", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.0", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5394,6 +6208,22 @@ "reusify": "^1.0.4" } }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -5519,6 +6349,21 @@ "node": ">= 6" } }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -5569,6 +6414,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-intrinsic": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", @@ -5606,6 +6461,23 @@ "node": ">= 0.4" } }, + "node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/giget": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.4.tgz", @@ -5671,6 +6543,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -5835,6 +6714,19 @@ "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", "license": "MIT" }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -5842,6 +6734,16 @@ "dev": true, "license": "MIT" }, + "node_modules/human-signals": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz", + "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/idb-keyval": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz", @@ -5964,6 +6866,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -6006,6 +6924,25 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-nan": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", @@ -6033,6 +6970,19 @@ "node": ">=0.12.0" } }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -6052,6 +7002,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", @@ -6068,16 +7031,45 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-what": { "version": "4.1.16", "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", "license": "MIT", "engines": { - "node": ">=12.13" + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" }, "funding": { - "url": "https://github.com/sponsors/mesqueeb" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isarray": { @@ -6114,6 +7106,13 @@ "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -6127,6 +7126,19 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -6147,6 +7159,32 @@ "dev": true, "license": "MIT" }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -6157,6 +7195,13 @@ "json-buffer": "3.0.1" } }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -6201,6 +7246,23 @@ "dev": true, "license": "MIT" }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lru-cache/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, "node_modules/magic-string": { "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", @@ -6415,6 +7477,16 @@ "dev": true, "license": "MIT" }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -6476,6 +7548,13 @@ "dev": true, "license": "MIT" }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, "node_modules/node-stdlib-browser": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-stdlib-browser/-/node-stdlib-browser-1.3.1.tgz", @@ -6540,6 +7619,36 @@ "ieee754": "^1.1.13" } }, + "node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -6648,6 +7757,25 @@ "dev": true, "license": "MIT" }, + "node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -6743,6 +7871,19 @@ "node": ">= 0.10" } }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -6970,6 +8111,22 @@ "node": ">=6.0.0" } }, + "node_modules/pretty-ms": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz", + "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -7235,6 +8392,19 @@ "fsevents": "~2.3.2" } }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -7489,6 +8659,34 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sirv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", + "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/sortablejs": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.6.tgz", @@ -7555,6 +8753,19 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -7612,6 +8823,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, "node_modules/synckit": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", @@ -7680,6 +8897,16 @@ "node": ">=8.0" } }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/ts-api-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", @@ -7797,6 +9024,60 @@ "dev": true, "license": "MIT" }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -7936,6 +9217,51 @@ } } }, + "node_modules/vite-hot-client": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-0.2.4.tgz", + "integrity": "sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" + } + }, + "node_modules/vite-plugin-inspect": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-0.8.9.tgz", + "integrity": "sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@antfu/utils": "^0.7.10", + "@rollup/pluginutils": "^5.1.3", + "debug": "^4.3.7", + "error-stack-parser-es": "^0.1.5", + "fs-extra": "^11.2.0", + "open": "^10.1.0", + "perfect-debounce": "^1.0.0", + "picocolors": "^1.1.1", + "sirv": "^3.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, "node_modules/vite-plugin-node-polyfills": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.23.0.tgz", @@ -7953,6 +9279,49 @@ "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, + "node_modules/vite-plugin-vue-devtools": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.7.1.tgz", + "integrity": "sha512-f1Fnda4CJYH7t7K1WaTEjFTLdF4oUkmlZTVwBGG5UhJ+Oa5KPX0Ue32c+YWRMOpCtFbCDl1iXGgQVzg8Ew5JnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-core": "^7.7.1", + "@vue/devtools-kit": "^7.7.1", + "@vue/devtools-shared": "^7.7.1", + "execa": "^9.5.1", + "sirv": "^3.0.0", + "vite-plugin-inspect": "0.8.9", + "vite-plugin-vue-inspector": "^5.3.1" + }, + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "vite": "^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0" + } + }, + "node_modules/vite-plugin-vue-inspector": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.1.tgz", + "integrity": "sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.0", + "@babel/plugin-proposal-decorators": "^7.23.0", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.22.15", + "@vue/babel-plugin-jsx": "^1.1.5", + "@vue/compiler-dom": "^3.3.4", + "kolorist": "^1.8.0", + "magic-string": "^0.30.4" + }, + "peerDependencies": { + "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0" + } + }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -8198,6 +9567,19 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index 1a3c1cf..f493ba0 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "typescript": "~5.7.0", "vite": "~6.1.0", "vite-plugin-node-polyfills": "^0.23.0", - "vue-tsc": "~2.2.0" + "vue-tsc": "~2.2.0", + "vite-plugin-vue-devtools": "^7.7.0" } } diff --git a/public/robots.txt b/public/robots.txt index 425b900..4737bcc 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,3 +1,7 @@ User-agent: * Disallow: /dashboard +Allow: / +Allow: /imprint +Allow: /privacy +Allow: /terms Allow: /login diff --git a/vite.config.ts b/vite.config.ts index 0f089af..b646b68 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,5 +1,6 @@ import { fileURLToPath, URL } from "node:url"; import { nodePolyfills } from "vite-plugin-node-polyfills"; +import vueDevTools from "vite-plugin-vue-devtools"; import { defineConfig } from "vite"; import vue from "@vitejs/plugin-vue"; @@ -16,6 +17,7 @@ export default defineConfig({ }, plugins: [ vue(), + vueDevTools(), nodePolyfills({ // To add only specific polyfills, add them here. If no option is passed, adds all polyfills include: ["buffer", "util", "stream", "process"], -- GitLab From ef14a0bb1b78bd88a8e6b33d778f8fbb96212bb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Wed, 12 Feb 2025 16:18:28 +0000 Subject: [PATCH 16/25] Update pinia to exclude dev-tools from build artifacts #191 --- package-lock.json | 52 +++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 681e9fc..e075511 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4272,23 +4272,23 @@ } }, "node_modules/@vue/devtools-api": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.1.tgz", - "integrity": "sha512-Cexc8GimowoDkJ6eNelOPdYIzsu2mgNyp0scOQ3tiaYSb9iok6LOESSsJvHaI+ib3joRfqRJNLkHFjhNuWA5dg==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.2.tgz", + "integrity": "sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA==", "license": "MIT", "dependencies": { - "@vue/devtools-kit": "^7.7.1" + "@vue/devtools-kit": "^7.7.2" } }, "node_modules/@vue/devtools-core": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.7.1.tgz", - "integrity": "sha512-W4CRrSZJodNIfrPO7/dXF6ZS0QyOY6PCYVhpSoTSx9+nh2wpZxcS1482lAdKM0FTlaoApHV6jXT95Me90hSaBA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.7.2.tgz", + "integrity": "sha512-lexREWj1lKi91Tblr38ntSsy6CvI8ba7u+jmwh2yruib/ltLUcsIzEjCnrkh1yYGGIKXbAuYV2tOG10fGDB9OQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/devtools-kit": "^7.7.1", - "@vue/devtools-shared": "^7.7.1", + "@vue/devtools-kit": "^7.7.2", + "@vue/devtools-shared": "^7.7.2", "mitt": "^3.0.1", "nanoid": "^5.0.9", "pathe": "^2.0.2", @@ -4325,12 +4325,12 @@ "license": "MIT" }, "node_modules/@vue/devtools-kit": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.1.tgz", - "integrity": "sha512-yhZ4NPnK/tmxGtLNQxmll90jIIXdb2jAhPF76anvn5M/UkZCiLJy28bYgPIACKZ7FCosyKoaope89/RsFJll1w==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.2.tgz", + "integrity": "sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ==", "license": "MIT", "dependencies": { - "@vue/devtools-shared": "^7.7.1", + "@vue/devtools-shared": "^7.7.2", "birpc": "^0.2.19", "hookable": "^5.5.3", "mitt": "^3.0.1", @@ -4340,9 +4340,9 @@ } }, "node_modules/@vue/devtools-shared": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.1.tgz", - "integrity": "sha512-BtgF7kHq4BHG23Lezc/3W2UhK2ga7a8ohAIAGJMBr4BkxUFzhqntQtCiuL1ijo2ztWnmusymkirgqUrXoQKumA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.2.tgz", + "integrity": "sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==", "license": "MIT", "dependencies": { "rfdc": "^1.4.1" @@ -7968,12 +7968,12 @@ } }, "node_modules/pinia": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.0.tgz", - "integrity": "sha512-Go23UsqaeABb4OYNmpDkE9VwDnqmbbjGzWpQhi3xfNkSPO6ZP+Ttt0EMo2J4DHXW+T0l3EqRneeXdyV/oJg/Mg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.1.tgz", + "integrity": "sha512-WXglsDzztOTH6IfcJ99ltYZin2mY8XZCXujkYWVIJlBjqsP6ST7zw+Aarh63E1cDVYeyUcPCxPHzJpEOmzB6Wg==", "license": "MIT", "dependencies": { - "@vue/devtools-api": "^7.7.1" + "@vue/devtools-api": "^7.7.2" }, "funding": { "url": "https://github.com/sponsors/posva" @@ -9280,15 +9280,15 @@ } }, "node_modules/vite-plugin-vue-devtools": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.7.1.tgz", - "integrity": "sha512-f1Fnda4CJYH7t7K1WaTEjFTLdF4oUkmlZTVwBGG5UhJ+Oa5KPX0Ue32c+YWRMOpCtFbCDl1iXGgQVzg8Ew5JnQ==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.7.2.tgz", + "integrity": "sha512-5V0UijQWiSBj32blkyPEqIbzc6HO9c1bwnBhx+ay2dzU0FakH+qMdNUT8nF9BvDE+i6I1U8CqCuJiO20vKEdQw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/devtools-core": "^7.7.1", - "@vue/devtools-kit": "^7.7.1", - "@vue/devtools-shared": "^7.7.1", + "@vue/devtools-core": "^7.7.2", + "@vue/devtools-kit": "^7.7.2", + "@vue/devtools-shared": "^7.7.2", "execa": "^9.5.1", "sirv": "^3.0.0", "vite-plugin-inspect": "0.8.9", -- GitLab From 47eee9e96033ebce357cc005bbf480f54ed171ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Fri, 14 Feb 2025 08:35:03 +0000 Subject: [PATCH 17/25] Add canonical URLs to improve SEO #191 --- .gitignore | 1 + src/views/HomeView.vue | 11 ++++++++++- src/views/ImprintView.vue | 15 ++++++++++++++- src/views/LoginView.vue | 11 ++++++++++- src/views/PrivacyPolicyView.vue | 13 ++++++++++++- src/views/TermsOfUsageView.vue | 15 ++++++++++++++- 6 files changed, 61 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 4ee9e22..762a2ec 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ coverage public/env.js public/google*.html +public/sitemap.txt diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 5547935..e8dda7d 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -1,5 +1,5 @@ <script setup lang="ts"> -import { computed, onBeforeMount, onMounted } from "vue"; +import { computed, onBeforeMount, onBeforeUnmount, onMounted } from "vue"; import { useRouter } from "vue-router"; import { useUserStore, useWorkflowStore } from "@/stores"; import BootstrapCard from "@/components/BootstrapCard.vue"; @@ -14,6 +14,11 @@ onBeforeMount(() => { if (authRepo.authenticated) { // If user is authenticated redirect him to the dashboard router.push({ name: "dashboard" }); + } else { + const linkTag = document.createElement("link"); + linkTag.setAttribute("rel", "canonical"); + linkTag.href = window.location.origin + window.location.pathname; + document.head.appendChild(linkTag); } }); @@ -32,6 +37,10 @@ function repositoryCommitUrl(workflow: PublicWorkflowOut) { onMounted(() => { workflowRepository.fetchPublicWorkflows(); }); + +onBeforeUnmount(() => { + document.head.querySelector("[rel=canonical]")?.remove(); +}); </script> <template> diff --git a/src/views/ImprintView.vue b/src/views/ImprintView.vue index dd22f4f..7030a46 100644 --- a/src/views/ImprintView.vue +++ b/src/views/ImprintView.vue @@ -1,4 +1,17 @@ -<script setup lang="ts"></script> +<script setup lang="ts"> +import { onBeforeMount, onBeforeUnmount } from "vue"; + +onBeforeMount(() => { + const linkTag = document.createElement("link"); + linkTag.setAttribute("rel", "canonical"); + linkTag.href = window.location.origin + window.location.pathname; + document.head.appendChild(linkTag); +}); + +onBeforeUnmount(() => { + document.head.querySelector("[rel=canonical]")?.remove(); +}); +</script> <template> <h2>Information according to §5 DDG (Digitale-Dienste-Gesetz)</h2> diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue index c24cab0..e7cd86a 100644 --- a/src/views/LoginView.vue +++ b/src/views/LoginView.vue @@ -1,5 +1,5 @@ <script setup lang="ts"> -import { onBeforeMount, onMounted } from "vue"; +import { onBeforeMount, onBeforeUnmount, onMounted } from "vue"; import { useUserStore } from "@/stores/users"; import { useRouter } from "vue-router"; import { Toast } from "bootstrap"; @@ -27,9 +27,18 @@ onBeforeMount(() => { if (store.authenticated) { // If user is authenticated redirect him to the dashboard router.push({ name: "dashboard" }); + } else { + const linkTag = document.createElement("link"); + linkTag.setAttribute("rel", "canonical"); + linkTag.href = window.location.origin + window.location.pathname; + document.head.appendChild(linkTag); } }); +onBeforeUnmount(() => { + document.head.querySelector("[rel=canonical]")?.remove(); +}); + function loginPath(provider: OidcProvider): string { const config: AuthKickstartLoginData = { url: "/auth/login/{provider}", diff --git a/src/views/PrivacyPolicyView.vue b/src/views/PrivacyPolicyView.vue index 14e0042..3a41255 100644 --- a/src/views/PrivacyPolicyView.vue +++ b/src/views/PrivacyPolicyView.vue @@ -1,5 +1,5 @@ <script setup lang="ts"> -import { onMounted } from "vue"; +import { onBeforeMount, onBeforeUnmount, onMounted } from "vue"; import { environment } from "@/environment"; onMounted(() => { @@ -12,6 +12,17 @@ onMounted(() => { document.head.appendChild(matomoScript); } }); + +onBeforeMount(() => { + const linkTag = document.createElement("link"); + linkTag.setAttribute("rel", "canonical"); + linkTag.href = window.location.origin + window.location.pathname; + document.head.appendChild(linkTag); +}); + +onBeforeUnmount(() => { + document.head.querySelector("[rel=canonical]")?.remove(); +}); </script> <template> diff --git a/src/views/TermsOfUsageView.vue b/src/views/TermsOfUsageView.vue index 0c05031..94a3aa0 100644 --- a/src/views/TermsOfUsageView.vue +++ b/src/views/TermsOfUsageView.vue @@ -1,4 +1,17 @@ -<script setup lang="ts"></script> +<script setup lang="ts"> +import { onBeforeMount, onBeforeUnmount } from "vue"; + +onBeforeMount(() => { + const linkTag = document.createElement("link"); + linkTag.setAttribute("rel", "canonical"); + linkTag.href = window.location.origin + window.location.pathname; + document.head.appendChild(linkTag); +}); + +onBeforeUnmount(() => { + document.head.querySelector("[rel=canonical]")?.remove(); +}); +</script> <template> <h2>Terms of Use</h2> -- GitLab From 092cc2fbf65f0ed9afb26f390143fb2d8a167db6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Thu, 20 Feb 2025 08:30:11 +0000 Subject: [PATCH 18/25] Show connected accounts in user admin view #191 --- package-lock.json | 577 ++++++++++++++--------------- public/robots.txt | 4 +- src/components/BootstrapCard.vue | 8 +- src/views/admin/AdminUsersView.vue | 20 +- src/views/user/ProfileView.vue | 4 +- 5 files changed, 313 insertions(+), 300 deletions(-) diff --git a/package-lock.json b/package-lock.json index e075511..a68aa65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1079,23 +1079,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.8.tgz", - "integrity": "sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", + "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.8", + "@babel/generator": "^7.26.9", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.7", - "@babel/parser": "^7.26.8", - "@babel/template": "^7.26.8", - "@babel/traverse": "^7.26.8", - "@babel/types": "^7.26.8", - "@types/gensync": "^1.0.0", + "@babel/helpers": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.9", + "@babel/types": "^7.26.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1121,14 +1120,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz", - "integrity": "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.8", - "@babel/types": "^7.26.8", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -1178,18 +1177,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz", + "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-replace-supers": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/traverse": "^7.26.9", "semver": "^6.3.1" }, "engines": { @@ -1339,26 +1338,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", - "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.7" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", - "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.8" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -1483,32 +1482,32 @@ } }, "node_modules/@babel/template": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz", - "integrity": "sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.8", - "@babel/types": "^7.26.8" + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz", - "integrity": "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.8", - "@babel/parser": "^7.26.8", - "@babel/template": "^7.26.8", - "@babel/types": "^7.26.8", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1527,9 +1526,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", - "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -2156,32 +2155,19 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", - "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.6.tgz", + "integrity": "sha512-+0TjwR1eAUdZtvv/ir1mGX+v0tUoR3VEPB8Up0LLJC+whRW0GgBBtpbOkg/a/U4Dxa6l5a3l9AJ1aWIQVyoWJA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.10.0", + "@eslint/core": "^0.11.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", - "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@fortawesome/fontawesome-free": { "version": "6.7.2", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz", @@ -2222,9 +2208,9 @@ } }, "node_modules/@hey-api/openapi-ts": { - "version": "0.64.3", - "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.64.3.tgz", - "integrity": "sha512-V/7KUq59T9uu4QXMminBlqWqoVqLggDSakRdHuJX+QRSkMUhso1d4QuMEzQcvaKt0uMQdHktPd1bdc2k5puH+g==", + "version": "0.64.5", + "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.64.5.tgz", + "integrity": "sha512-Vl6QQbkb+TXPG/ihobCPj/13KFJPfnjTVljno+T18L2ywL8cRHDFYqi5356ktBixBuwK2cSJvKzxYR6TIMq+AA==", "dev": true, "license": "MIT", "dependencies": { @@ -2299,9 +2285,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2815,9 +2801,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.6.tgz", - "integrity": "sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", + "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", "cpu": [ "arm" ], @@ -2829,9 +2815,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.6.tgz", - "integrity": "sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", + "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", "cpu": [ "arm64" ], @@ -2843,9 +2829,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.6.tgz", - "integrity": "sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", + "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", "cpu": [ "arm64" ], @@ -2857,9 +2843,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.6.tgz", - "integrity": "sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", + "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", "cpu": [ "x64" ], @@ -2871,9 +2857,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.6.tgz", - "integrity": "sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", + "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", "cpu": [ "arm64" ], @@ -2885,9 +2871,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.6.tgz", - "integrity": "sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", + "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", "cpu": [ "x64" ], @@ -2899,9 +2885,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.6.tgz", - "integrity": "sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", + "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", "cpu": [ "arm" ], @@ -2913,9 +2899,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.6.tgz", - "integrity": "sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", + "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", "cpu": [ "arm" ], @@ -2927,9 +2913,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.6.tgz", - "integrity": "sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", + "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", "cpu": [ "arm64" ], @@ -2941,9 +2927,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.6.tgz", - "integrity": "sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", + "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", "cpu": [ "arm64" ], @@ -2955,9 +2941,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.6.tgz", - "integrity": "sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", + "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", "cpu": [ "loong64" ], @@ -2969,9 +2955,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.6.tgz", - "integrity": "sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", + "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", "cpu": [ "ppc64" ], @@ -2983,9 +2969,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.6.tgz", - "integrity": "sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", + "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", "cpu": [ "riscv64" ], @@ -2997,9 +2983,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.6.tgz", - "integrity": "sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", + "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", "cpu": [ "s390x" ], @@ -3011,9 +2997,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.6.tgz", - "integrity": "sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", + "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", "cpu": [ "x64" ], @@ -3025,9 +3011,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.6.tgz", - "integrity": "sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", + "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", "cpu": [ "x64" ], @@ -3039,9 +3025,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.6.tgz", - "integrity": "sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", + "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", "cpu": [ "arm64" ], @@ -3053,9 +3039,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.6.tgz", - "integrity": "sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", + "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", "cpu": [ "ia32" ], @@ -3067,9 +3053,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.6.tgz", - "integrity": "sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", + "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", "cpu": [ "x64" ], @@ -3162,9 +3148,9 @@ } }, "node_modules/@smithy/core": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.1.2.tgz", - "integrity": "sha512-htwQXkbdF13uwwDevz9BEzL5ABK+1sJpVQXywwGSH973AVOvisHNfpcB8A8761G6XgHoS2kHPqc9DqHJ2gp+/Q==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.1.4.tgz", + "integrity": "sha512-wFExFGK+7r2wYriOqe7RRIBNpvxwiS95ih09+GSLRBdoyK/O1uZA7K7pKesj5CBvwJuSBeXwLyR88WwIAY+DGA==", "license": "Apache-2.0", "dependencies": { "@smithy/middleware-serde": "^4.0.2", @@ -3172,7 +3158,7 @@ "@smithy/types": "^4.1.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-middleware": "^4.0.1", - "@smithy/util-stream": "^4.0.2", + "@smithy/util-stream": "^4.1.1", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -3380,12 +3366,12 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.3.tgz", - "integrity": "sha512-YdbmWhQF5kIxZjWqPIgboVfi8i5XgiYMM7GGKFMTvBei4XjNQfNv8sukT50ITvgnWKKKpOtp0C0h7qixLgb77Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.5.tgz", + "integrity": "sha512-cPzGZV7qStHwboFrm6GfrzQE+YDiCzWcTh4+7wKrP/ZQ4gkw+r7qDjV8GjM4N0UYsuUyLfpzLGg5hxsYTU11WA==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.1.2", + "@smithy/core": "^3.1.4", "@smithy/middleware-serde": "^4.0.2", "@smithy/node-config-provider": "^4.0.1", "@smithy/shared-ini-file-loader": "^4.0.1", @@ -3399,15 +3385,15 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.4.tgz", - "integrity": "sha512-wmxyUBGHaYUqul0wZiset4M39SMtDBOtUr2KpDuftKNN74Do9Y36Go6Eqzj9tL0mIPpr31ulB5UUtxcsCeGXsQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.6.tgz", + "integrity": "sha512-s8QzuOQnbdvRymD9Gt9c9zMq10wUQAHQ3z72uirrBHCwZcLTrL5iCOuVTMdka2IXOYhQE890WD5t6G24+F+Qcg==", "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^4.0.1", "@smithy/protocol-http": "^5.0.1", "@smithy/service-error-classification": "^4.0.1", - "@smithy/smithy-client": "^4.1.3", + "@smithy/smithy-client": "^4.1.5", "@smithy/types": "^4.1.0", "@smithy/util-middleware": "^4.0.1", "@smithy/util-retry": "^4.0.1", @@ -3573,17 +3559,17 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.3.tgz", - "integrity": "sha512-A2Hz85pu8BJJaYFdX8yb1yocqigyqBzn+OVaVgm+Kwi/DkN8vhN2kbDVEfADo6jXf5hPKquMLGA3UINA64UZ7A==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.5.tgz", + "integrity": "sha512-DMXYoYeL4QkElr216n1yodTFeATbfb4jwYM9gKn71Rw/FNA1/Sm36tkTSCsZEs7mgpG3OINmkxL9vgVFzyGPaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.1.2", - "@smithy/middleware-endpoint": "^4.0.3", + "@smithy/core": "^3.1.4", + "@smithy/middleware-endpoint": "^4.0.5", "@smithy/middleware-stack": "^4.0.1", "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", - "@smithy/util-stream": "^4.0.2", + "@smithy/util-stream": "^4.1.1", "tslib": "^2.6.2" }, "engines": { @@ -3680,13 +3666,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.4.tgz", - "integrity": "sha512-Ej1bV5sbrIfH++KnWxjjzFNq9nyP3RIUq2c9Iqq7SmMO/idUR24sqvKH2LUQFTSPy/K7G4sB2m8n7YYlEAfZaw==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.6.tgz", + "integrity": "sha512-N8+VCt+piupH1A7DgSVDNrVHqRLz8r6DvBkpS7EWHiIxsUk4jqGuQLjqC/gnCzmwGkVBdNruHoYAzzaSQ8e80w==", "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^4.0.1", - "@smithy/smithy-client": "^4.1.3", + "@smithy/smithy-client": "^4.1.5", "@smithy/types": "^4.1.0", "bowser": "^2.11.0", "tslib": "^2.6.2" @@ -3696,16 +3682,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.4.tgz", - "integrity": "sha512-HE1I7gxa6yP7ZgXPCFfZSDmVmMtY7SHqzFF55gM/GPegzZKaQWZZ+nYn9C2Cc3JltCMyWe63VPR3tSFDEvuGjw==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.6.tgz", + "integrity": "sha512-9zhx1shd1VwSSVvLZB8CM3qQ3RPD3le7A3h/UPuyh/PC7g4OaWDi2xUNzamsVoSmCGtmUBONl56lM2EU6LcH7A==", "license": "Apache-2.0", "dependencies": { "@smithy/config-resolver": "^4.0.1", "@smithy/credential-provider-imds": "^4.0.1", "@smithy/node-config-provider": "^4.0.1", "@smithy/property-provider": "^4.0.1", - "@smithy/smithy-client": "^4.1.3", + "@smithy/smithy-client": "^4.1.5", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, @@ -3767,9 +3753,9 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.0.2.tgz", - "integrity": "sha512-0eZ4G5fRzIoewtHtwaYyl8g2C+osYOT4KClXgfdNEDAgkbe2TYPqcnw4GAWabqkZCax2ihRGPe9LZnsPdIUIHA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.1.1.tgz", + "integrity": "sha512-+Xvh8nhy0Wjv1y71rBVyV3eJU3356XsFQNI8dEZVNrQju7Eib8G31GWtO+zMa9kTCGd41Mflu+ZKfmQL/o2XzQ==", "license": "Apache-2.0", "dependencies": { "@smithy/fetch-http-handler": "^5.0.1", @@ -3858,13 +3844,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/gensync": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.4.tgz", - "integrity": "sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/hammerjs": { "version": "2.0.46", "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz", @@ -3879,9 +3858,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.13.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz", - "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dev": true, "license": "MIT", "dependencies": { @@ -3924,17 +3903,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.0.tgz", - "integrity": "sha512-aFcXEJJCI4gUdXgoo/j9udUYIHgF23MFkg09LFz2dzEmU0+1Plk4rQWv/IYKvPHAtlkkGoB3m5e6oUp+JPsNaQ==", + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz", + "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.24.0", - "@typescript-eslint/type-utils": "8.24.0", - "@typescript-eslint/utils": "8.24.0", - "@typescript-eslint/visitor-keys": "8.24.0", + "@typescript-eslint/scope-manager": "8.24.1", + "@typescript-eslint/type-utils": "8.24.1", + "@typescript-eslint/utils": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -3954,16 +3933,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.0.tgz", - "integrity": "sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA==", + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz", + "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.24.0", - "@typescript-eslint/types": "8.24.0", - "@typescript-eslint/typescript-estree": "8.24.0", - "@typescript-eslint/visitor-keys": "8.24.0", + "@typescript-eslint/scope-manager": "8.24.1", + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/typescript-estree": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1", "debug": "^4.3.4" }, "engines": { @@ -3979,14 +3958,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.0.tgz", - "integrity": "sha512-HZIX0UByphEtdVBKaQBgTDdn9z16l4aTUz8e8zPQnyxwHBtf5vtl1L+OhH+m1FGV9DrRmoDuYKqzVrvWDcDozw==", + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz", + "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.0", - "@typescript-eslint/visitor-keys": "8.24.0" + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3997,14 +3976,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.0.tgz", - "integrity": "sha512-8fitJudrnY8aq0F1wMiPM1UUgiXQRJ5i8tFjq9kGfRajU+dbPyOuHbl0qRopLEidy0MwqgTHDt6CnSeXanNIwA==", + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz", + "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.24.0", - "@typescript-eslint/utils": "8.24.0", + "@typescript-eslint/typescript-estree": "8.24.1", + "@typescript-eslint/utils": "8.24.1", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, @@ -4021,9 +4000,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.0.tgz", - "integrity": "sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw==", + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz", + "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==", "dev": true, "license": "MIT", "engines": { @@ -4035,14 +4014,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.0.tgz", - "integrity": "sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ==", + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz", + "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.0", - "@typescript-eslint/visitor-keys": "8.24.0", + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -4062,16 +4041,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.0.tgz", - "integrity": "sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ==", + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz", + "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.24.0", - "@typescript-eslint/types": "8.24.0", - "@typescript-eslint/typescript-estree": "8.24.0" + "@typescript-eslint/scope-manager": "8.24.1", + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/typescript-estree": "8.24.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4086,13 +4065,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.0.tgz", - "integrity": "sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg==", + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz", + "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.0", + "@typescript-eslint/types": "8.24.1", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -4299,9 +4278,9 @@ } }, "node_modules/@vue/devtools-core/node_modules/nanoid": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", - "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.0.tgz", + "integrity": "sha512-zDAl/llz8Ue/EblwSYwdxGBYfj46IM1dhjVi8dyp9LQffoIGxJEAHj2oeZ4uNcgycSRcQ83CnfcZqEJzVDLcDw==", "dev": true, "funding": [ { @@ -4390,9 +4369,9 @@ } }, "node_modules/@vue/language-core": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", - "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.2.tgz", + "integrity": "sha512-QotO41kurE5PLf3vrNgGTk3QswO2PdUFjBwNiOi7zMmGhwb25PSTh9hD1MCgKC06AVv+8sZQvlL3Do4TTVHSiQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4400,7 +4379,7 @@ "@vue/compiler-dom": "^3.5.0", "@vue/compiler-vue2": "^2.7.16", "@vue/shared": "^3.5.0", - "alien-signals": "^0.4.9", + "alien-signals": "^1.0.3", "minimatch": "^9.0.3", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1" @@ -4523,9 +4502,9 @@ } }, "node_modules/alien-signals": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", - "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.4.tgz", + "integrity": "sha512-DJqqQD3XcsaQcQ1s+iE2jDUZmmQpXwHiR6fCAim/w87luaW+vmLY8fMlrdkmRwzaFXhkxf3rqPCR59tKVv1MDw==", "dev": true, "license": "MIT" }, @@ -4984,9 +4963,9 @@ } }, "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -5023,9 +5002,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001699", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", - "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", + "version": "1.0.30001700", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", + "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", "dev": true, "funding": [ { @@ -5061,9 +5040,9 @@ } }, "node_modules/chart.js": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.7.tgz", - "integrity": "sha512-pwkcKfdzTMAU/+jNosKhNL2bHtJc/sSmYgVbuGTEDhzkrhmyihmP7vUc/5ZK9WopidMDHNe3Wm7jOd/WhuHWuw==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.8.tgz", + "integrity": "sha512-IkGZlVpXP+83QpMm4uxEiGqSI7jFizwVtF3+n5Pc3k7sMO+tkd0qxh2OzLhenM0K80xtmAONWGBn082EiBQSDA==", "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" @@ -5594,9 +5573,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.97", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.97.tgz", - "integrity": "sha512-HKLtaH02augM7ZOdYRuO19rWDeY+QSJ1VxnXFa/XDFLf07HvM90pALIJFgrO+UVaajI3+aJMMpojoUTLZyQ7JQ==", + "version": "1.5.102", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.102.tgz", + "integrity": "sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==", "dev": true, "license": "ISC" }, @@ -5675,6 +5654,22 @@ "node": ">= 0.4" } }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { "version": "0.24.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", @@ -6291,9 +6286,9 @@ } }, "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, "license": "ISC" }, @@ -6335,14 +6330,15 @@ } }, "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "license": "MIT", "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" }, "engines": { @@ -6627,7 +6623,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -7478,9 +7473,9 @@ "license": "MIT" }, "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, "license": "MIT", "engines": { @@ -8031,9 +8026,9 @@ } }, "node_modules/postcss": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", - "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "funding": [ { "type": "opencollective", @@ -8083,9 +8078,9 @@ } }, "node_modules/prettier": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.0.tgz", - "integrity": "sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.1.tgz", + "integrity": "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==", "dev": true, "license": "MIT", "bin": { @@ -8272,9 +8267,9 @@ } }, "node_modules/readdirp": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", - "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { @@ -8354,9 +8349,9 @@ } }, "node_modules/rollup": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.6.tgz", - "integrity": "sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", + "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8370,25 +8365,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.34.6", - "@rollup/rollup-android-arm64": "4.34.6", - "@rollup/rollup-darwin-arm64": "4.34.6", - "@rollup/rollup-darwin-x64": "4.34.6", - "@rollup/rollup-freebsd-arm64": "4.34.6", - "@rollup/rollup-freebsd-x64": "4.34.6", - "@rollup/rollup-linux-arm-gnueabihf": "4.34.6", - "@rollup/rollup-linux-arm-musleabihf": "4.34.6", - "@rollup/rollup-linux-arm64-gnu": "4.34.6", - "@rollup/rollup-linux-arm64-musl": "4.34.6", - "@rollup/rollup-linux-loongarch64-gnu": "4.34.6", - "@rollup/rollup-linux-powerpc64le-gnu": "4.34.6", - "@rollup/rollup-linux-riscv64-gnu": "4.34.6", - "@rollup/rollup-linux-s390x-gnu": "4.34.6", - "@rollup/rollup-linux-x64-gnu": "4.34.6", - "@rollup/rollup-linux-x64-musl": "4.34.6", - "@rollup/rollup-win32-arm64-msvc": "4.34.6", - "@rollup/rollup-win32-ia32-msvc": "4.34.6", - "@rollup/rollup-win32-x64-msvc": "4.34.6", + "@rollup/rollup-android-arm-eabi": "4.34.8", + "@rollup/rollup-android-arm64": "4.34.8", + "@rollup/rollup-darwin-arm64": "4.34.8", + "@rollup/rollup-darwin-x64": "4.34.8", + "@rollup/rollup-freebsd-arm64": "4.34.8", + "@rollup/rollup-freebsd-x64": "4.34.8", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", + "@rollup/rollup-linux-arm-musleabihf": "4.34.8", + "@rollup/rollup-linux-arm64-gnu": "4.34.8", + "@rollup/rollup-linux-arm64-musl": "4.34.8", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", + "@rollup/rollup-linux-riscv64-gnu": "4.34.8", + "@rollup/rollup-linux-s390x-gnu": "4.34.8", + "@rollup/rollup-linux-x64-gnu": "4.34.8", + "@rollup/rollup-linux-x64-musl": "4.34.8", + "@rollup/rollup-win32-arm64-msvc": "4.34.8", + "@rollup/rollup-win32-ia32-msvc": "4.34.8", + "@rollup/rollup-win32-x64-msvc": "4.34.8", "fsevents": "~2.3.2" } }, @@ -8468,9 +8463,9 @@ } }, "node_modules/sass": { - "version": "1.84.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.84.0.tgz", - "integrity": "sha512-XDAbhEPJRxi7H0SxrnOpiXFQoUJHwkR2u3Zc4el+fK/Tt5Hpzw5kkQ59qVDfvdaUq6gCrEZIbySFBM2T9DNKHg==", + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", + "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", "dev": true, "license": "MIT", "dependencies": { @@ -8673,9 +8668,9 @@ } }, "node_modules/sirv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", - "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", + "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", "dev": true, "license": "MIT", "dependencies": { @@ -8780,9 +8775,9 @@ } }, "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.0.tgz", + "integrity": "sha512-a4NGarQIHRhvr+k8VXaHg6TMU6f3YEmi5CAb6RYgX2gwbGDBNMbr6coC6g0wmif5dLjHtmHUVD/qOxPq7D0tnQ==", "license": "MIT" }, "node_modules/superjson": { @@ -8974,15 +8969,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.0.tgz", - "integrity": "sha512-/lmv4366en/qbB32Vz5+kCNZEMf6xYHwh1z48suBwZvAtnXKbP+YhGe8OLE2BqC67LMqKkCNLtjejdwsdW6uOQ==", + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.1.tgz", + "integrity": "sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.24.0", - "@typescript-eslint/parser": "8.24.0", - "@typescript-eslint/utils": "8.24.0" + "@typescript-eslint/eslint-plugin": "8.24.1", + "@typescript-eslint/parser": "8.24.1", + "@typescript-eslint/utils": "8.24.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9146,14 +9141,14 @@ } }, "node_modules/vite": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.0.tgz", - "integrity": "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.1.tgz", + "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.24.2", - "postcss": "^8.5.1", + "postcss": "^8.5.2", "rollup": "^4.30.1" }, "bin": { @@ -9449,14 +9444,14 @@ "license": "MIT" }, "node_modules/vue-tsc": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.0.tgz", - "integrity": "sha512-gtmM1sUuJ8aSb0KoAFmK9yMxb8TxjewmxqTJ1aKphD5Cbu0rULFY6+UQT51zW7SpUcenfPUuflKyVwyx9Qdnxg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.2.tgz", + "integrity": "sha512-1icPKkxAA5KTAaSwg0wVWdE48EdsH8fgvcbAiqojP4jXKl6LEM3soiW1aG/zrWrFt8Mw1ncG2vG1PvpZpVfehA==", "dev": true, "license": "MIT", "dependencies": { "@volar/typescript": "~2.4.11", - "@vue/language-core": "2.2.0" + "@vue/language-core": "2.2.2" }, "bin": { "vue-tsc": "bin/vue-tsc.js" diff --git a/public/robots.txt b/public/robots.txt index 4737bcc..d224bea 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,7 +1,9 @@ User-agent: * -Disallow: /dashboard +Disallow: /workflows +Disallow: /api Allow: / Allow: /imprint Allow: /privacy Allow: /terms Allow: /login +Allow: /signup diff --git a/src/components/BootstrapCard.vue b/src/components/BootstrapCard.vue index 6539ee5..6bec2a5 100644 --- a/src/components/BootstrapCard.vue +++ b/src/components/BootstrapCard.vue @@ -1,8 +1,4 @@ -<script setup lang="ts"> -import { useSlots } from "vue"; - -const slots = useSlots(); -</script> +<script setup lang="ts"></script> <template> <div class="card"> @@ -10,7 +6,7 @@ const slots = useSlots(); <div class="card-title"> <slot name="title" /> </div> - <h6 v-if="slots.subtitle" class="card-subtitle mb-2 text-body-secondary"> + <h6 v-if="$slots.subtitle" class="card-subtitle mb-2 text-body-secondary"> <slot name="subtitle" /> </h6> <div class="card-text"> diff --git a/src/views/admin/AdminUsersView.vue b/src/views/admin/AdminUsersView.vue index b62f506..cebd4fa 100644 --- a/src/views/admin/AdminUsersView.vue +++ b/src/views/admin/AdminUsersView.vue @@ -212,6 +212,8 @@ onMounted(() => { <th scope="col"><b>Name</b></th> <th scope="col">UID</th> <th scope="col">Email</th> + <th scope="col">Lifescience AAI</th> + <th scope="col">NFDI AAI</th> <th v-for="role in Object.values(RoleEnum)" :key="role" @@ -225,7 +227,7 @@ onMounted(() => { </thead> <tbody v-if="userState.users.length === 0"> <tr> - <td colspan="9" class="text-center fst-italic fw-light"> + <td colspan="11" class="text-center fst-italic fw-light"> <template v-if="userState.searched" >No Users found with specified filters </template> @@ -251,6 +253,22 @@ onMounted(() => { user.email }}</a> </td> + <td> + <input + type="checkbox" + class="form-check-input" + :checked="user.lifescience_id != undefined" + disabled + /> + </td> + <td> + <input + type="checkbox" + class="form-check-input" + :checked="user.nfdi_id != undefined" + disabled + /> + </td> <td v-for="role in Object.values(RoleEnum)" :key="role" diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue index 7cf5544..57d47b9 100644 --- a/src/views/user/ProfileView.vue +++ b/src/views/user/ProfileView.vue @@ -111,7 +111,9 @@ onMounted(() => { <div v-if="userRepository.user?.lifescience_id"> <b>Linked account: </b> <a href="https://profile.aai.lifescience-ri.eu/profile" - >{{ userRepository.user?.lifescience_id }}​@lifescience.eu</a + >{{ + userRepository.user?.lifescience_id + }}​@lifescience-ri.eu</a > </div> <div v-else> -- GitLab From b00de87e7df648183fee130ef02a7a7af18de85a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Fri, 21 Feb 2025 14:06:45 +0000 Subject: [PATCH 19/25] Add modal when logging in the first time #191 --- package-lock.json | 47 ++++++++++++++------- src/App.vue | 25 +++++++++-- src/components/LoginButtons.vue | 73 +++++++++++++++++++++++++++++++++ src/main.ts | 6 +-- src/router/index.ts | 3 ++ src/views/LoginView.vue | 68 ++++-------------------------- src/views/SignupView.vue | 50 ++++++++++++++-------- 7 files changed, 173 insertions(+), 99 deletions(-) create mode 100644 src/components/LoginButtons.vue diff --git a/package-lock.json b/package-lock.json index a68aa65..35360ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1993,9 +1993,9 @@ } }, "node_modules/@eslint/compat": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.6.tgz", - "integrity": "sha512-k7HNCqApoDHM6XzT30zGoETj+D+uUcZUb+IVAJmar3u6bvHf7hhHJcWx09QHj4/a2qrKZMWU0E16tvkiAdv06Q==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.7.tgz", + "integrity": "sha512-xvv7hJE32yhegJ8xNAnb62ggiAwTYHBpUCWhRxEj/ksvgDJuSXfoDkBcRYaYNFiJ+jH0IE3K16hd+xXzhBgNbg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2155,19 +2155,32 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.6.tgz", - "integrity": "sha512-+0TjwR1eAUdZtvv/ir1mGX+v0tUoR3VEPB8Up0LLJC+whRW0GgBBtpbOkg/a/U4Dxa6l5a3l9AJ1aWIQVyoWJA==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", + "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.11.0", + "@eslint/core": "^0.12.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@fortawesome/fontawesome-free": { "version": "6.7.2", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz", @@ -7658,15 +7671,15 @@ } }, "node_modules/nypm": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.5.2.tgz", - "integrity": "sha512-AHzvnyUJYSrrphPhRWWZNcoZfArGNp3Vrc4pm/ZurO74tYNTgAPrEyBQEKy+qioqmWlPXwvMZCG2wOaHlPG0Pw==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.5.4.tgz", + "integrity": "sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA==", "dev": true, "license": "MIT", "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", - "pathe": "^2.0.2", + "pathe": "^2.0.3", "pkg-types": "^1.3.1", "tinyexec": "^0.3.2", "ufo": "^1.5.4" @@ -8775,9 +8788,15 @@ } }, "node_modules/strnum": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.0.tgz", - "integrity": "sha512-a4NGarQIHRhvr+k8VXaHg6TMU6f3YEmi5CAb6RYgX2gwbGDBNMbr6coC6g0wmif5dLjHtmHUVD/qOxPq7D0tnQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.1.tgz", + "integrity": "sha512-O7aCHfYCamLCctjAiaucmE+fHf2DYHkus2OKCn4Wv03sykfFtgeECn505X6K4mPl8CRNd/qurC9guq+ynoN4pw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "license": "MIT" }, "node_modules/superjson": { diff --git a/src/App.vue b/src/App.vue index e3158c4..c63cc1d 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,5 +1,5 @@ <script setup lang="ts"> -import { onBeforeMount, onMounted } from "vue"; +import { onBeforeMount, onMounted, ref } from "vue"; import { useCookies } from "vue3-cookies"; import { useRoute, useRouter } from "vue-router"; import { client } from "@/client/client.gen.ts"; @@ -20,6 +20,8 @@ import { } from "@/stores"; import { stringify as param_stringify } from "qs"; import { OwnershipTypeEnum } from "@/client/types.gen"; +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; +import { Modal } from "bootstrap"; const { cookies } = useCookies(); const router = useRouter(); @@ -35,7 +37,10 @@ const otrRepository = useOTRStore(); const executionRepository = useWorkflowExecutionStore(); const newsStore = useNewsStore(); +const firstLogin = ref<boolean>(false); + onBeforeMount(() => { + firstLogin.value = window.location.href.includes("first_login=True"); client.setConfig({ throwOnError: true, baseURL: environment.API_BASE_URL, @@ -137,9 +142,6 @@ onBeforeMount(() => { } }); nameRepository.loadNameMapping(); -}); - -onMounted(() => { if (userRepository.authenticated) { Promise.all([ s3KeyRepository.fetchS3Keys(), @@ -172,11 +174,26 @@ onMounted(() => { } } }); + +onMounted(() => { + if (firstLogin.value && userRepository.authenticated) { + Modal.getOrCreateInstance("#welcome-modal")?.show(); + } +}); </script> <template> <AppHeader /> <div class="container-fluid container-xxxl mt-2 flex-grow-1 py-2"> + <bootstrap-modal + v-if="firstLogin && userRepository.authenticated" + modal-id="welcome-modal" + modal-label="Welcome Modal" + static-backdrop + > + <template #header>Hello to CloWM</template> + <template #body>This is your first time in CloWM</template> + </bootstrap-modal> <router-view /> </div> <AppFooter /> diff --git a/src/components/LoginButtons.vue b/src/components/LoginButtons.vue new file mode 100644 index 0000000..08add3e --- /dev/null +++ b/src/components/LoginButtons.vue @@ -0,0 +1,73 @@ +<script setup lang="ts"> +import { type AuthKickstartLoginData, OidcProvider } from "@/client"; +import { environment } from "@/environment.ts"; +import { client } from "@/client/client.gen.ts"; + +const props = defineProps<{ + returnPath?: string; + invitationToken?: string; + showAccountCreationHint?: boolean; +}>(); + +function loginPath(provider: OidcProvider): string { + const config: AuthKickstartLoginData = { + url: "/auth/login/{provider}", + path: { + provider: provider, + }, + query: { + next: + props.returnPath != undefined ? encodeURI(props.returnPath) : undefined, + invitation_token: + props.invitationToken != undefined ? props.invitationToken : undefined, + }, + }; + return ( + environment.API_BASE_URL + client.buildUrl<AuthKickstartLoginData>(config) + ); +} +</script> + +<template> + <div class="my-2 text-center"> + <div class="fs-5">LifeScience Login</div> + <a :href="loginPath(OidcProvider.LIFESCIENCE_AAI)"> + <img + src="/src/assets/images/ls-login.png" + alt="[LS Login]" + class="img-fluid" + style="max-height: 90px" + /> + </a> + </div> + <div class="my-2 mt-4 text-center"> + <div class="fs-5">NFDI AAI</div> + <a :href="loginPath(OidcProvider.NFDI_AAI)"> + <img + src="/src/assets/images/nfdi-aai.png" + alt="[NFDi AAI]" + class="img-fluid" + style="max-height: 90px" + /> + </a> + </div> + <div + v-if="showAccountCreationHint && invitationToken == undefined" + class="mt-2" + > + Don't have an account? + <router-link :to="{ name: 'signup', query: { next: props.returnPath } }"> + Create an account + </router-link> + . + </div> + <div class="mt-2"> + By using this service you agree to our + <router-link :to="{ name: 'terms' }"> terms of usage</router-link> + and + <router-link :to="{ name: 'privacy' }"> privacy policy</router-link> + . + </div> +</template> + +<style scoped></style> diff --git a/src/main.ts b/src/main.ts index 93d3f60..c21bf73 100644 --- a/src/main.ts +++ b/src/main.ts @@ -65,9 +65,9 @@ app.use(router); const theme = localStorage.getItem("theme") as PossibleThemes; if (theme != undefined) { useSettingsStore().setTheme(theme); -} //else if (window.matchMedia("(prefers-color-scheme: dark)").matches) { -// document.querySelector("html")?.setAttribute("data-bs-theme", "dark"); -//} +} else if (window.matchMedia("(prefers-color-scheme: dark)").matches) { + useSettingsStore().setTheme("dark"); +} app.mount("#app"); diff --git a/src/router/index.ts b/src/router/index.ts index 154e3aa..dd5b66a 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -46,6 +46,9 @@ const router = createRouter({ title: "Signup", public: true, }, + props: (route) => ({ + returnPath: route.query.next ?? undefined, + }), }, { path: "/", diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue index e7cd86a..8e9f065 100644 --- a/src/views/LoginView.vue +++ b/src/views/LoginView.vue @@ -4,12 +4,7 @@ import { useUserStore } from "@/stores/users"; import { useRouter } from "vue-router"; import { Toast } from "bootstrap"; import BootstrapToast from "@/components/BootstrapToast.vue"; -import { - type AuthKickstartLoginData, - OidcProvider, -} from "@/client/types.gen.ts"; -import { client } from "@/client/client.gen.ts"; -import { environment } from "@/environment.ts"; +import LoginButtons from "@/components/LoginButtons.vue"; const router = useRouter(); @@ -39,24 +34,6 @@ onBeforeUnmount(() => { document.head.querySelector("[rel=canonical]")?.remove(); }); -function loginPath(provider: OidcProvider): string { - const config: AuthKickstartLoginData = { - url: "/auth/login/{provider}", - path: { - provider: provider, - }, - query: { - next: - props.returnPath != undefined ? encodeURI(props.returnPath) : undefined, - invitation_token: - props.invitationToken != undefined ? props.invitationToken : undefined, - }, - }; - return ( - environment.API_BASE_URL + client.buildUrl<AuthKickstartLoginData>(config) - ); -} - onMounted(() => { errorToast = new Toast("#loginErrorToast"); // if there is a query param 'login_error' show the error toast @@ -108,42 +85,11 @@ onMounted(() => { ><span class="clowm-red fw-bold">W</span ><span class="clowm-green fw-bold">M</span> via </p> - <div class="my-2 text-center"> - <div class="fs-5">LifeScience Login</div> - <a :href="loginPath(OidcProvider.LIFESCIENCE_AAI)"> - <img - src="/src/assets/images/ls-login.png" - alt="[LS Login]" - class="img-fluid" - style="max-height: 90px" - /> - </a> - </div> - <div class="my-2 mt-4 text-center"> - <div class="fs-5">NFDI AAI</div> - <a :href="loginPath(OidcProvider.NFDI_AAI)"> - <img - src="/src/assets/images/nfdi-aai.png" - alt="[NFDi AAI]" - class="img-fluid" - style="max-height: 90px" - /> - </a> - </div> - <div v-if="invitationToken == undefined" class="mt-2"> - Don't have an account? - <router-link :to="{ name: 'signup' }"> - Create an account - </router-link> - . - </div> - <div class="mt-2"> - By using this service you agree to our - <router-link :to="{ name: 'terms' }">terms of usage</router-link> - and - <router-link :to="{ name: 'privacy' }">privacy policy</router-link> - . - </div> + <login-buttons + :return-path="returnPath" + :invitation-token="invitationToken" + show-account-creation-hint + /> </div> </div> </div> @@ -153,10 +99,12 @@ onMounted(() => { .middle-screen { top: 40% !important; } + @media (max-height: 750px) { .hide-sm { display: none !important; } + .middle-screen { top: 50% !important; } diff --git a/src/views/SignupView.vue b/src/views/SignupView.vue index eb31f46..734a1ac 100644 --- a/src/views/SignupView.vue +++ b/src/views/SignupView.vue @@ -1,5 +1,31 @@ <script setup lang="ts"> -import { environment } from "@/environment"; +import { onBeforeMount, onBeforeUnmount } from "vue"; +import { useUserStore } from "@/stores"; +import { useRouter } from "vue-router"; +import LoginButtons from "@/components/LoginButtons.vue"; + +defineProps<{ + returnPath?: string; +}>(); + +const router = useRouter(); +const store = useUserStore(); + +onBeforeMount(() => { + if (store.authenticated) { + // If user is authenticated redirect him to the dashboard + router.push({ name: "dashboard" }); + } else { + const linkTag = document.createElement("link"); + linkTag.setAttribute("rel", "canonical"); + linkTag.href = window.location.origin + window.location.pathname; + document.head.appendChild(linkTag); + } +}); + +onBeforeUnmount(() => { + document.head.querySelector("[rel=canonical]")?.remove(); +}); </script> <template> @@ -8,9 +34,11 @@ import { environment } from "@/environment"; </h2> <p> The only prerequisite for using CloWM is a - <a href="https://lifescience-ri.eu/">LifeScience</a> account. + <a href="https://lifescience-ri.eu/">LifeScience</a> or + <a href="https://iam.services.base4nfdi.de">NFDI</a> + account. </p> - <h4>I don't have a LifeScience Account</h4> + <h4>I don't have such an Account</h4> <p> I you don't have a LifeScience account yet, you can register by going to the <a @@ -25,21 +53,7 @@ import { environment } from "@/environment"; account will be created automatically for you. </p> <div class="d-flex flex-column mx-auto w-fit align-items-center mt-5"> - <a :href="`${environment.API_BASE_URL}/auth/login?provider=lifescience`"> - <img - src="/src/assets/images/ls-login.png" - alt="[LS Login]" - style="max-height: 70px" - class="hover-shadow" - /> - </a> - <div class="mt-2"> - By using this service you agree to our - <router-link :to="{ name: 'terms' }"> terms of usage </router-link> - and - <router-link :to="{ name: 'privacy' }"> privacy policy </router-link> - . - </div> + <login-buttons :return-path="returnPath" /> </div> </template> -- GitLab From 4059e4b7cf770e88c3f2620e6735d2bccabe85e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Fri, 21 Feb 2025 14:55:51 +0000 Subject: [PATCH 20/25] Show CPU hours and used bucket storage for own buckets #191 --- src/App.vue | 13 +++++++--- src/stores/s3objects.ts | 13 ++++++++++ src/views/DashboardView.vue | 25 +++++++++++++++++++ .../admin/AdminWorkflowExecutionView.vue | 2 +- .../workflows/ListWorkflowExecutionsView.vue | 6 +++++ 5 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/App.vue b/src/App.vue index c63cc1d..a0ea967 100644 --- a/src/App.vue +++ b/src/App.vue @@ -147,11 +147,14 @@ onBeforeMount(() => { s3KeyRepository.fetchS3Keys(), bucketRepository.fetchOwnBuckets(), ]).then(() => { - Promise.all( - bucketRepository.buckets + Promise.all([ + ...bucketRepository.buckets .filter((bucket) => bucket.owner_id === userRepository.currentUID) .map((bucket) => objectRepository.fetchMultipartUploads(bucket.name)), - ); + objectRepository.fetchS3ObjectsForMultipleBuckets( + bucketRepository.ownBuckets.map((bucket) => bucket.name), + ), + ]); }); resourceRepository.fetchPublicResources(); workflowRepository.fetchWorkflows(); @@ -169,6 +172,10 @@ onBeforeMount(() => { resourceRepository.fetchOwnResources(); otrRepository.fetchOwnOtrs(OwnershipTypeEnum.RESOURCE); } + if (userRepository.reviewer || userRepository.admin) { + resourceRepository.fetchReviewableResources(); + workflowRepository.fetchReviewableWorkflows(); + } if (userRepository.admin) { resourceRepository.fetchSyncRequests(); } diff --git a/src/stores/s3objects.ts b/src/stores/s3objects.ts index 0555fe4..6263954 100644 --- a/src/stores/s3objects.ts +++ b/src/stores/s3objects.ts @@ -129,9 +129,13 @@ export const useS3ObjectStore = defineStore("s3objects", { bucketName: string, prefix?: string, onFinally?: () => void, + returnCache: boolean = false, ): Promise<S3Object[]> { if (this.objectMapping[bucketName] != undefined) { onFinally?.(); + if (returnCache) { + return this.objectMapping[bucketName]; + } } const pag = paginateListObjectsV2( { client: this.client }, @@ -381,5 +385,14 @@ export const useS3ObjectStore = defineStore("s3objects", { } }); }, + async fetchS3ObjectsForMultipleBuckets( + bucketNames: string[], + ): Promise<S3Object[]> { + return Promise.all( + bucketNames.map((bucket) => + this.fetchS3Objects(bucket, undefined, undefined, true), + ), + ).then((objectsPerBucket) => objectsPerBucket.flat()); + }, }, }); diff --git a/src/views/DashboardView.vue b/src/views/DashboardView.vue index 688db82..e6bb46e 100644 --- a/src/views/DashboardView.vue +++ b/src/views/DashboardView.vue @@ -27,6 +27,7 @@ import dayjs from "dayjs"; import { latestVersion } from "@/utils/Workflow.ts"; import NewsCard from "@/components/news/NewsCard.vue"; import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import { filesize } from "filesize"; const authStore = useUserStore(); const bucketStore = useBucketStore(); @@ -202,6 +203,18 @@ function accumulateWorkflowStatus( }} shared bucket(s) </li> + <li> + {{ + filesize( + bucketStore.ownBuckets + .map((bucket) => objectStore.objectMapping[bucket.name]) + .filter((objs) => objs != undefined) + .flat() + .reduce((acc, cur) => acc + (cur.Size ?? 0), 0), + ) + }} + in own buckets + </li> </ul> </template> </bootstrap-card> @@ -359,6 +372,18 @@ function accumulateWorkflowStatus( }} erroneous execution(s) </li> + <li> + {{ + executionStore.executions + .reduce( + (acc, cur) => acc.add(dayjs.duration(cur.cpu_time)), + dayjs.duration(0, "day"), + ) + .asHours() + .toFixed(2) + }} + used CPU hours + </li> </ul> </template> </bootstrap-card> diff --git a/src/views/admin/AdminWorkflowExecutionView.vue b/src/views/admin/AdminWorkflowExecutionView.vue index 347c18d..13f5940 100644 --- a/src/views/admin/AdminWorkflowExecutionView.vue +++ b/src/views/admin/AdminWorkflowExecutionView.vue @@ -449,7 +449,7 @@ onMounted(() => { </template> <template v-else> -</template> </td> - <td> + <td class="text-center"> {{ Math.floor(dayjs.duration(execution.cpu_time).asHours()) }}:{{ dayjs.duration(execution.cpu_time).format("mm:ss") }} diff --git a/src/views/workflows/ListWorkflowExecutionsView.vue b/src/views/workflows/ListWorkflowExecutionsView.vue index c48260a..0c6d234 100644 --- a/src/views/workflows/ListWorkflowExecutionsView.vue +++ b/src/views/workflows/ListWorkflowExecutionsView.vue @@ -182,6 +182,7 @@ onUnmounted(() => { <th scope="col">Started</th> <th scope="col">Duration</th> <th scope="col">Ended</th> + <th scope="col">CPU hours [HH:mm:ss]</th> <th scope="col"></th> </tr> </thead> @@ -280,6 +281,11 @@ onUnmounted(() => { </template> <template v-else> -</template> </td> + <td class="text-center"> + {{ Math.floor(dayjs.duration(execution.cpu_time).asHours()) }}:{{ + dayjs.duration(execution.cpu_time).format("mm:ss") + }} + </td> <td class="text-end"> <div class="btn-group btn-group-sm dropdown-center dropdown-menu-start" -- GitLab From a6957e621575c93947e5b4dbba0604aac9fbd4a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Mon, 24 Feb 2025 13:49:57 +0000 Subject: [PATCH 21/25] Improve admin views #191 --- openapi-clowm.json | 7324 ++++++++++++++++- package-lock.json | 112 +- package.json | 2 +- src/App.vue | 3 +- src/client/types.gen.ts | 4 + src/views/SignupView.vue | 19 +- src/views/admin/AdminBucketsView.vue | 81 +- src/views/admin/AdminResourcesView.vue | 102 +- src/views/admin/AdminUsersView.vue | 115 +- .../admin/AdminWorkflowExecutionView.vue | 124 +- src/views/user/ProfileView.vue | 2 +- 11 files changed, 7761 insertions(+), 127 deletions(-) diff --git a/openapi-clowm.json b/openapi-clowm.json index 262eef4..723fc4a 100644 --- a/openapi-clowm.json +++ b/openapi-clowm.json @@ -1 +1,7323 @@ -{"openapi":"3.1.0","info":{"title":"CloWM UI API","description":"This is the API for the CloWM UI. It is only for internal use and will change without prior notice.","version":"1.0"},"servers":[{"url":"/api"}],"paths":{"/auth/login/{provider}":{"get":{"tags":["Auth"],"summary":"Kickstart the login flow","description":"Redirect route to OIDC provider to kickstart the login process.","operationId":"Auth-kickstart_login","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider","description":"The OIDC provider to use for login"},"description":"The OIDC provider to use for login"},{"name":"invitation_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":43,"maxLength":43},{"type":"null"}],"description":"Unique token to validate an invitation","title":"Invitation Token"},"description":"Unique token to validate an invitation"},{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Will be appended to redirect response in the callback route as URL query parameter `next`","title":"Next"},"description":"Will be appended to redirect response in the callback route as URL query parameter `next`"}],"responses":{"302":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login/callback/{provider}":{"get":{"tags":["Auth"],"summary":"LifeScience Login Callback","description":"Callback for the login process with an OIDC Provider.\n\nVisit the route login route to start the login process.\n\nIf the user is already known to the system, then a JWT token will be created and sent via the 'set-cookie' header.\nThe key for this Cookie is 'bearer'.\n\nIf the user is new, he will be created him and then a JWT token is issued.\n\nThis JWT has to be sent to all authorized endpoints via the HTTPBearer scheme.","operationId":"Auth-login_callback","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider"}}],"responses":{"302":{"description":"Successful Response","headers":{"Set-Cookie":{"description":"JWT for accessing the API","schema":{"type":"string","example":"clowm-jwt=fake-jwt-cookie; Domain=localhost; Max-Age=691200; Path=/; SameSite=strict; Secure"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/account/connect/{provider}":{"get":{"tags":["Auth"],"summary":"Kickstart the account connection flow","description":"Redirect route to OIDC provider to connect the CloWM account with the AAI account.","operationId":"Auth-kickstart_account_connection","security":[{"Session Token":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider","description":"The OIDC provider to use for login"},"description":"The OIDC provider to use for login"}],"responses":{"302":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/account/callback/{provider}":{"get":{"tags":["Auth"],"summary":"LifeScience Login Callback","description":"Callback for the account connection process with an OIDC provider.","operationId":"Auth-account_connection_callback","security":[{"Session Token":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider"}}],"responses":{"302":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"get":{"tags":["Auth"],"summary":"Logout","description":"Logout the user from the system by deleting the bearer cookie.","operationId":"Auth-logout","responses":{"302":{"description":"Successful Response","headers":{"Set-Cookie":{"description":"JWT for accessing the API","schema":{"type":"string","example":"clowm-jwt=; Domain=localhost; Max-Age=0; Path=/; SameSite=strict; Secure"}}}}}}},"/ui/tokens":{"get":{"tags":["APIToken"],"summary":"List API token","description":"List meta information about all API token.\n\nPermissions `api_token:list_all` required. See parameter `uid` for exception.","operationId":"APIToken-list_token","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiTokenOut"},"title":"Response Apitoken-List Token"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["APIToken"],"summary":"Create new API token","description":"Create a new API token for the current user.\n\nPermission `api_token:create` required.","operationId":"APIToken-create_token","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenIn","description":"Meta-data for Api token to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenPrivateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/tokens/{tid}":{"get":{"tags":["APIToken"],"summary":"Get API token","description":"Get an API token by id.\n\nPermission `api_token:read` required if the current user is the owner of the API token,\notherwise `api_token:read_any` required.","operationId":"APIToken-get_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["APIToken"],"summary":"Delete API token","description":"Delete an API token by id.\n\nPermission `api_token:delete` required if the current user is the owner of the API token,\notherwise `api_token:delete_any` required.","operationId":"APIToken-delete_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users":{"post":{"tags":["User"],"summary":"Create User","description":"Create a new user in the system and notify him.\n\nPermission `user:create` required.","operationId":"User-create_user","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserIn","description":"Meta-data for user to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["User"],"summary":"List users and search by their name","description":"List all users in the system..\n\nPermission `user:list` required.","operationId":"User-list_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter users by a substring in their name.","examples":["Bilbo"],"title":"Name Substring"},"description":"Filter users by a substring in their name."},{"name":"filter_roles","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/RoleEnum"}},{"type":"null"}],"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression.","title":"Filter Roles"},"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOutExtended"},"title":"Response User-List Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/search":{"get":{"tags":["User"],"summary":"Search Users","description":"Search for users in the system by their name.\n\nPermission `user: search` required.","operationId":"User-search_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":30,"description":"Filter users by a substring in their name.","title":"Name Substring"},"description":"Filter users by a substring in their name."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOut"},"title":"Response User-Search Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/me":{"get":{"tags":["User"],"summary":"Get the logged in user","description":"Return the user associated with the used JWT.\n\nPermission `user:read` required.","operationId":"User-get_logged_in_user","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}}},"security":[{"Session Token":[]}]}},"/ui/users/{uid}":{"get":{"tags":["User"],"summary":"Get a user by its uid","description":"Return the user with the specific uid.\n\nPermission `user:read` required.","operationId":"User-get_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["User"],"summary":"Delete a user","description":"Delete a user and his S3 account.\n\nPermission `user:delete` required if the current user is the target user.","operationId":"User-delete_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/roles":{"put":{"tags":["User"],"summary":"Update user roles","description":"Update the roles of a user.\n\nPermission `user:update` required.","operationId":"User-update_roles","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRoles","description":"The new roles of the user"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/invitation":{"patch":{"tags":["User"],"summary":"Resend Invitation","description":"Resend the invitation link for an user that has an open invitation.\n\nPermission `user:create` required.","operationId":"User-resend_invitation","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys":{"get":{"tags":["S3Key"],"summary":"Get the S3 Access keys from a user","description":"Get all the S3 Access keys for a specific user.\n\nPermission `s3_key:list` required if the current user is the target, otherwise `s3_key:list_all` required.","operationId":"S3Key-get_user_keys","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/S3Key"},"title":"Response S3Key-Get User Keys"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["S3Key"],"summary":"Create a Access key for a user","description":"Create a S3 Access key for a specific user.\n\nPermission `s3_key:create` required if the current user is the target, otherwise `s3_key:create_any` required.","operationId":"S3Key-create_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys/{access_id}":{"get":{"tags":["S3Key"],"summary":"Get a specific S3 Access key from a user","description":"Get a specific S3 Access Key for a specific user.\n\nPermission `s3_key:read` required if the current user is the target, otherwise `s3_key:read_any` required.","operationId":"S3Key-get_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["S3Key"],"summary":"Delete a specific S3 Access key from a user","description":"Delete a specific S3 Access key for a specific user.\n\nPermission `s3_key:delete` required if the current user is the target, otherwise `s3_key:delete_any` required.","operationId":"S3Key-delete_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets":{"get":{"tags":["Bucket"],"summary":"List buckets","description":"List all the buckets in the system or of the desired user where the user has permissions for.\n\nPermission `bucket:list_all` required. See parameter `owner_id` for exception.","operationId":"Bucket-list_buckets","security":[{"Session Token":[]}],"parameters":[{"name":"owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Owner Id"},"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target."},{"name":"bucket_type","in":"query","required":false,"schema":{"$ref":"#/components/schemas/BucketType","description":"Type of the bucket to get. Ignored when `user` parameter not set","default":"ALL"},"description":"Type of the bucket to get. Ignored when `user` parameter not set"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketOut"},"title":"Response Bucket-List Buckets"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket for the current user","description":"Create a bucket for the current user.\n\nThe name of the bucket has some constraints.\nFor more information see the\n[Ceph documentation](https://docs.ceph.com/en/quincy/radosgw/s3/bucketops/#constraints)\n\nPermission `bucket:create` required.","operationId":"Bucket-create_bucket","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketIn","description":"Meta-data for bucket to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"List bucket OTRs","description":"Get the ownership transfer requests for buckets.\n\nPermission `bucket:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `bucket:list_all`","operationId":"Bucket-list_bucket_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Bucket-List Bucket Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}":{"get":{"tags":["Bucket"],"summary":"Get a bucket by its name","description":"Get a bucket by its name if the current user has READ permissions for the bucket.\n\nPermission `bucket:read` required if the current user is the owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket","description":"Delete a bucket by its name. Only the owner of the bucket can delete the bucket.\n\nPermission `bucket:delete` required if the current user is the owner of the bucket,\notherwise `bucket:delete_any` required.","operationId":"Bucket-delete_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"force_delete","in":"query","required":false,"schema":{"type":"boolean","description":"Delete even non-empty bucket","default":false,"title":"Force Delete"},"description":"Delete even non-empty bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"Get a bucket OTR","description":"Get a specific bucket ownership transfer request.\n\nPermission `bucket:read` required if the current user is the current or new owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket OTR","description":"Create a ownership transfer request for a specific bucket.\n\nPermission `bucket:update` required if the current user is the current owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-create_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the bucket OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Bucket"],"summary":"Accept a bucket OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `bucket:update` required if the current user is the new owner of the workflow,\notherwise `bucket:update_any` required.","operationId":"Bucket-accept_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket OTR","description":"Delete/Reject a bucket ownership transfer request.\n\nPermission `bucket:update` required if the current user is the current or new owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-delete_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/public":{"patch":{"tags":["Bucket"],"summary":"Update public status","description":"Update the buckets public state.\n\nPermission `bucket:update` required if the current user is the owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-update_bucket_public_state","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_Bucket-update_bucket_public_state"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/limits":{"patch":{"tags":["Bucket"],"summary":"Update bucket limits","description":"Update the buckets size limits.\n\nPermission `bucket:update_any` required.","operationId":"Bucket-update_bucket_limits","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketSizeLimits","description":"New size limits for bucket"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions.","description":"List all the bucket permissions in the system.\n\nPermission `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions","security":[{"Session Token":[]}],"parameters":[{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["BucketPermission"],"summary":"Create a permission.","description":"Create a permission for a bucket and user.\n\nPermission `bucket_permission:create` required.","operationId":"BucketPermission-create_permission","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionIn","description":"Permission to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a user.","description":"List all the bucket permissions for the given user.\n\nPermission `bucket_permission:list` required if current user is the target the bucket permission,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per User"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a bucket.","description":"List all the bucket permissions for the given bucket.\n\nPermission `bucket_permission:list` required if current user is owner of the bucket,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per Bucket"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get permission for bucket and user combination.","description":"Get the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:read` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:read_any` required.","operationId":"BucketPermission-get_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["BucketPermission"],"summary":"Update a bucket permission","description":"Update a permission for a bucket and user.\n\nPermission `bucket_permission:update` required.","operationId":"BucketPermission-update_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionParameters","description":"Permission to create"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["BucketPermission"],"summary":"Delete a bucket permission","description":"Delete the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:delete` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:delete_any` required.","operationId":"BucketPermission-delete_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows":{"post":{"tags":["Workflow"],"summary":"Create a new workflow","description":"Create a new workflow.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow-create_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowIn","description":"Meta-date for the workflow to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow"],"summary":"List workflows","description":"List all workflows.\n\nPermission `workflow:list` required.","operationId":"Workflow-list_workflows","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter workflows by a substring in their name.","examples":["blast"],"title":"Name Substring"},"description":"Filter workflows by a substring in their name."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`.","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`."},{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowOut"},"title":"Response Workflow-List Workflows"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"List workflow OTRs","description":"Get the ownership transfer requests for workflows.\n\nPermission `workflow:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `workflow:list_all`","operationId":"Workflow-list_workflow_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Workflow-List Workflow Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/developer_statistics":{"get":{"tags":["Workflow"],"summary":"Get anonymized workflow execution","description":"Get the workflow executions with meta information and anonymized user IDs.\n\nPermission `workflow:read` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:read_any`.","operationId":"Workflow-get_developer_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter by the developer of the workflows","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter by the developer of the workflows"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"description":"Filter by workflow IDs","title":"Workflow Id"},"description":"Filter by workflow IDs"},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions after this date","title":"Start"},"description":"Filter by workflow executions after this date"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions before this date","title":"End"},"description":"Filter by workflow executions before this date"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnonymizedWorkflowExecution"},"title":"Response Workflow-Get Developer Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}":{"get":{"tags":["Workflow"],"summary":"Get a workflow","description":"Get a specific workflow.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow","description":"Delete a workflow.\n\nPermission `workflow:delete` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:delete_any`.","operationId":"Workflow-delete_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"Get a workflow OTR","description":"Get a specific workflow ownership transfer request.\n\nPermission `workflow:read` required if current user is the current or new owner of the workflow,\notherwise `workflow:read_any` required.","operationId":"Workflow-get_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Workflow"],"summary":"Create a workflow OTR","description":"Create a ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the current owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-create_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for workflow OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Workflow"],"summary":"Accept a workflow OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-accept_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow OTR","description":"Delete/Reject a workflow ownership transfer request.\n\nPermission `workflow:update` required if current user is the current or new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-delete_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/statistics":{"get":{"tags":["Workflow"],"summary":"Get statistics for a workflow","description":"Get the number of started workflow per day.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowStatistic"},"title":"Response Workflow-Get Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/update":{"post":{"tags":["Workflow"],"summary":"Update a workflow","description":"Create a new workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow-update_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdate","description":"Meta-data for the workflow version to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions":{"get":{"tags":["Workflow Version"],"summary":"Get all versions of a workflow","description":"List all versions of a Workflow.\n\nPermission `workflow:list` required.","operationId":"Workflow Version-list_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"title":"Response Workflow Version-List Workflow Version"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}":{"get":{"tags":["Workflow Version"],"summary":"Get a workflow version","description":"Get a specific version of a workflow.\n\nPermission `workflow:read` required if the version is public or you are the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit `git_commit_hash` of specific version or `latest`.","examples":["latest","ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit `git_commit_hash` of specific version or `latest`."},{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/status":{"patch":{"tags":["Workflow Version"],"summary":"Update status of workflow version","description":"Update the status of a workflow version.\n\nPermission `workflow:update_status`","operationId":"Workflow Version-update_workflow_version_status","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionStatusSchema","description":"New Status of the workflow version"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/metadata":{"get":{"tags":["Workflow Version"],"summary":"Get metadata of workflow version","description":"Get the metadata of a workflow version.\n\nPermission `workflow:read` required if the current user is the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Version"],"summary":"Update metadata of workflow version","description":"Update the metadata of a workflow version.\n\nPermission `workflow:update` required if the current user is the developer of the workflow,\notherwise `workflow:update_any`","operationId":"Workflow Version-update_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/deprecate":{"patch":{"tags":["Workflow Version"],"summary":"Deprecate a workflow version","description":"Deprecate a workflow version.\n\nPermission `workflow:update` required if you are the developer of the workflow,\notherwise `workflow:update_status`","operationId":"Workflow Version-deprecate_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/parameter-extension":{"patch":{"tags":["Workflow Version"],"summary":"Update parameter extension of workflow version","description":"Update the parameter extension of a workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-update_workflow_version_parameter_extension","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParameterExtension-Input","description":"Parameter extension specific for this CloWM instance"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/documentation":{"get":{"tags":["Workflow Version"],"summary":"Fetch documentation for a workflow version","description":"Get the documentation for a specific workflow version.\nStreams the response directly from the right git repository.\n\nPermission `workflow:read` required.","operationId":"Workflow Version-download_workflow_documentation","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."},{"name":"document","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DocumentationEnum","description":"Specify which type of documentation the client wants to fetch","default":"usage.md"},"description":"Specify which type of documentation the client wants to fetch"},{"name":"mode_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Workflow Mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"Workflow Mode"}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/icon":{"post":{"tags":["Workflow Version"],"summary":"Upload icon for workflow version","description":"Upload an icon for the workflow version and returns the new icon URL.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-upload_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_Workflow_Version-upload_workflow_version_icon"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IconUpdateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Version"],"summary":"Delete icon of workflow version","description":"Delete the icon of the workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-delete_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions":{"post":{"tags":["Workflow Execution"],"summary":"Start a new workflow execution","description":"Start a new workflow execution. Workflow versions wit status `DEPRECATED` or `DENIED` can't be started.\n\nPermission `workflow_execution:create` required if workflow versions status is `PUBLISHED`,\notherwise `workflow_execution:create_any` required.","operationId":"Workflow Execution-start_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow Execution"],"summary":"List all workflow executions","description":"Get all workflow executions.\n\nThis endpoint enforces keyset pagination. To iterate over all workflow executions, follow the link provided in the\n`Link` header.\nA missing `Link` header indicates that you iterated over all workflow executions with the current filters.\n\nPermission `workflow_execution:list` required, if `executor_id` is the same as the current user,\notherwise `workflow_execution:list_all` required.","operationId":"Workflow Execution-list_workflow_executions","security":[{"Session Token":[]}],"parameters":[{"name":"executor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Executor Id"},"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required."},{"name":"execution_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionStatus"}},{"type":"null"}],"description":"Filter for status of workflow execution","title":"Execution Status"},"description":"Filter for status of workflow execution"},{"name":"workflow_version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":40,"maxLength":40,"pattern":"^[0-9a-f]+$"},{"type":"null"}],"description":"Filter for workflow version","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Workflow Version Id"},"description":"Filter for workflow version"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Workflow Id"},"description":"Filter for workflow"},{"name":"start_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started after this UNIX timestamp","examples":[1640991600],"title":"Start After"},"description":"Filter for workflow executions that started after this UNIX timestamp"},{"name":"start_before","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started before this UNIX timestamp","examples":[1640991600],"title":"Start Before"},"description":"Filter for workflow executions that started before this UNIX timestamp"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionOut"},"title":"Response Workflow Execution-List Workflow Executions"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<https://dev.clowm.de/api/workflow_executions?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/arbitrary":{"post":{"tags":["Workflow Execution"],"summary":"Start a workflow execution with arbitrary git repository","description":"Start a new workflow execution from an arbitrary git repository.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow Execution-start_arbitrary_workflow","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevWorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Session Token":[]}]}},"/ui/workflow_executions/{eid}":{"get":{"tags":["Workflow Execution"],"summary":"Get a workflow execution","description":"Get a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Execution"],"summary":"Delete a workflow execution","description":"Delete a specific workflow execution.\n\nPermission `workflow_execution:delete` required if the current user started the workflow execution,\notherwise `workflow_execution:delete_any` required.","operationId":"Workflow Execution-delete_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/params":{"get":{"tags":["Workflow Execution"],"summary":"Get the parameters of a workflow execution","description":"Get the parameters of a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution_params","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Workflow Execution-Get Workflow Execution Params"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/cancel":{"post":{"tags":["Workflow Execution"],"summary":"Cancel a workflow execution","description":"Cancel a running workflow execution.\n\nPermission `workflow_execution:cancel` required if the current user started the workflow execution,\notherwise `workflow_execution:cancel_any` required.","operationId":"Workflow Execution-cancel_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/credentials":{"get":{"tags":["Workflow Credentials"],"summary":"Get the credentials of a workflow","description":"Get the credentials for the repository of a workflow. Only the developer of a workflow can do this.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-get_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Credentials"],"summary":"Update the credentials of a workflow","description":"Update the credentials for the repository of a workflow.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-update_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsIn","description":"Updated credentials for the workflow git repository"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Credentials"],"summary":"Delete the credentials of a workflow","description":"Delete the credentials for the repository of a workflow.\n\nPermission `workflow:delete` required if the developer of the workflow is the same as the current user,\nother `workflow:delete_any`.","operationId":"Workflow Credentials-delete_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_modes/{mode_id}":{"get":{"tags":["Workflow Mode"],"summary":"Get workflow mode","description":"Get a workflow mode.\n\nPermission `workflow:read` required","operationId":"Workflow Mode-get_workflow_mode","security":[{"Session Token":[]}],"parameters":[{"name":"mode_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"ID of a workflow mode"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowModeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources":{"post":{"tags":["Resource"],"summary":"Request a new resource","description":"Request a new resources.\n\nPermission `resource:create` required.","operationId":"Resource-create_resource","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceIn","description":"Meta-data for the resource to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Resource"],"summary":"List resources","description":"List all resources.\n\nPermission `resource:list` required.","operationId":"Resource-list_resources","security":[{"Session Token":[]}],"parameters":[{"name":"maintainer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Maintainer Id"},"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required."},{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"description":"Filter resources by a substring in their name.","examples":["gtdb"],"title":"Name Substring"},"description":"Filter resources by a substring in their name."},{"name":"public","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter resources to by the public flag","title":"Public"},"description":"Filter resources to by the public flag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceOut"},"title":"Response Resource-List Resources"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/sync_requests":{"get":{"tags":["Resource"],"summary":"List resource sync requests","description":"List all resource sync requests.\n\nPermission `resource:update_any` required.","operationId":"Resource-list_sync_requests","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UserSynchronizationRequestOut"},"type":"array","title":"Response Resource-List Sync Requests"}}}}},"security":[{"Session Token":[]}]}},"/ui/resources/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"List resource OTRs","description":"Get the ownership transfer requests for resources.\n\nPermission `resource:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `resource:list_all`","operationId":"Resource-list_resource_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Resource-List Resource Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}":{"get":{"tags":["Resource"],"summary":"Get a resource","description":"Get a specific resource.\n\nPermission `resource:read` required.","operationId":"Resource-get_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource","description":"Delete a resources.\n\nPermission `resource:delete` required.","operationId":"Resource-delete_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"Get a resource OTR","description":"Get a specific resource ownership transfer request.\n\nPermission `resource:read` required if the current user is the current or new owner of the resource,\notherwise `resource:read_any` required.","operationId":"Resource-get_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Resource"],"summary":"Create a resource OTR","description":"Create a ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the current owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-create_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the resource OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Resource"],"summary":"Accept a resource OTR","description":"Accept an ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-accept_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource OTR","description":"Delete/Reject a resource ownership transfer request.\n\nPermission `resource:update` required if the current user is the current or new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-delete_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions":{"get":{"tags":["ResourceVersion"],"summary":"List versions of a resource","description":"List all the resource version for a specific resource.\n\nPermission 'resource:read' required.","operationId":"ResourceVersion-list_resource_versions","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionOut"},"title":"Response Resourceversion-List Resource Versions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["ResourceVersion"],"summary":"Request new version of a resource","description":"Request a new resource version.\n\nPermission `resource:update` required if the current user is the maintainer, `resource:update_any` otherwise.","operationId":"ResourceVersion-request_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionIn","description":"Meta-data for the resource version to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}":{"get":{"tags":["ResourceVersion"],"summary":"Get version of a resource","description":"Get a specific resource version for a specific resource.\n\nPermission `resource:read` required. If the status of the resource version is not `LATEST` or `SYNCHRONIZED` and\nthe current user is not the maintainer, then the permission `resource:read_any` is required.","operationId":"ResourceVersion-get_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/tree":{"get":{"tags":["ResourceVersion"],"summary":"Download folder structure of resource","description":"Get the folder structure of the resources. Only available if the resource was previously downloaded to the cluster.\n\nPermission `resource:read` required.","operationId":"ResourceVersion-resource_file_tree","security":[{"Session Token":[]}],"parameters":[{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"},{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FileTree"},"title":"Response Resourceversion-Resource File Tree"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_review":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version review","description":"Request the review of a resource version.\n\nPermission `resource:update` required.","operationId":"ResourceVersion-request_resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_sync":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version synchronization","description":"Request the synchronization of a resource version to the cluster.\n\nPermission `resource:request_sync` required.","operationId":"ResourceVersion-request_resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSynchronizationRequestIn","description":"Meta-data for the synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/review":{"put":{"tags":["ResourceVersion"],"summary":"Review resource version","description":"Review answer the resource version.\n\nPermission `resource:update_status` required.","operationId":"ResourceVersion-resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer for the resource version review"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/sync":{"put":{"tags":["ResourceVersion"],"summary":"Synchronize resource version with cluster","description":"Synchronize the resource version to the cluster.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer to the resource version synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/latest":{"put":{"tags":["ResourceVersion"],"summary":"Set resource version to latest","description":"Set the resource version as the latest version.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_latest","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/cluster":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version on cluster","description":"Delete the resource version on the cluster.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_cluster","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/s3":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version in S3","description":"Delete the resource version in the S3 bucket.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_s3","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news":{"post":{"tags":["News"],"summary":"Create news","description":"Create a news event.\n\nPermission `news:create` required.","operationId":"News-create_news","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsIn","description":"Meta-data for news event to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["News"],"summary":"List news","description":"List all news events with filters.\n\nThis endpoint enforces keyset pagination. To iterate over all news, follow the link provided in the `Link` header.\nA missing `Link` header indicates that you iterated over all news with the current filters.\n\nPermission `news:list` required.","operationId":"News-list_news","security":[{"Session Token":[]}],"parameters":[{"name":"created_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967296,"minimum":0},{"type":"null"}],"description":"Filter for news that are created after this UNIX timestamp","title":"Created After"},"description":"Filter for news that are created after this UNIX timestamp"},{"name":"creator_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for news created by a specific user","title":"Creator Id"},"description":"Filter for news created by a specific user"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NewsOut"},"title":"Response News-List News"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<https://dev.clowm.de/api/news?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news/latest":{"get":{"tags":["News"],"summary":"Get latest news","description":"List the current news events.\n\nPermission `news:list` required.","operationId":"News-list_latest_news","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NewsOut"},"type":"array","title":"Response News-List Latest News"}}}}},"security":[{"Session Token":[]}]}},"/ui/news/{nid}":{"get":{"tags":["News"],"summary":"Get a specific news","description":"Get a specified news event.\n\nPermission `news:read` required.","operationId":"News-get_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["News"],"summary":"Delete a specific news","description":"Delete a specified news event.\n\nPermission `news:delete` required.","operationId":"News-delete_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/public/workflows":{"get":{"tags":["Public"],"summary":"Get available workflows","description":"Public route to fetch all available workflows.","operationId":"Public-get_public_workflows","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PublicWorkflowOut"},"type":"array","title":"Response Public-Get Public Workflows"}}}}}}}},"components":{"schemas":{"AnonymizedWorkflowExecution":{"properties":{"workflow_execution_id":{"type":"string","title":"Workflow Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"pseudo_uid":{"type":"string","title":"Pseudo Uid","description":"Anonymized user ID of the user who ran the workflow execution","examples":["7ed4249857b656e96f456449796e461e6001d3fb2481a44701f70ca437bd53a2"]},"workflow_mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Mode Id","description":"ID of the workflow mode this workflow execution ran in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"workflow_version_id":{"type":"string","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"started_at":{"type":"string","format":"date","title":"Started At","description":"Day of the workflow execution","examples":["2023-01-01"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"developer_id":{"type":"string","title":"Developer Id","description":"ID of developer of the workflow","examples":["28c5353b8bb34984a8bd4169ba94c606"]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"End status of the workflow execution","examples":["SUCCESS"]}},"type":"object","required":["workflow_execution_id","pseudo_uid","workflow_version_id","started_at","workflow_id","developer_id","status"],"title":"AnonymizedWorkflowExecution"},"ApiTokenIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"}},"type":"object","required":["name","scopes"],"title":"ApiTokenIn"},"ApiTokenOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]}},"type":"object","required":["name","scopes","token_id","uid","created_at"],"title":"ApiTokenOut"},"ApiTokenPrivateOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]},"token":{"type":"string","title":"Token","description":"The actual token used for authentication","examples":["J21NRKUYgyVUgvJ3cIdllS-MMa9ny1UDKFF18aetDvo"]}},"type":"object","required":["name","scopes","token_id","uid","created_at","token"],"title":"ApiTokenPrivateOut"},"Body_Bucket-update_bucket_public_state":{"properties":{"public":{"type":"boolean","title":"Public","description":"New public state"}},"type":"object","required":["public"],"title":"Body_Bucket-update_bucket_public_state"},"Body_Workflow_Version-upload_workflow_version_icon":{"properties":{"icon":{"type":"string","format":"binary","title":"Icon","description":"Icon for the Workflow."}},"type":"object","required":["icon"],"title":"Body_Workflow Version-upload_workflow_version_icon"},"BucketIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]}},"type":"object","required":["name","description"],"title":"BucketIn","description":"Schema for creating a new bucket."},"BucketOut":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]},"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]},"owner_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Id","description":"UID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"public":{"type":"boolean","title":"Public","description":"Flag if the bucket is anonymously readable"}},"type":"object","required":["name","description","created_at","owner_id","public"],"title":"BucketOut","description":"Schema for answering a request with a bucket."},"BucketPermissionIn":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","format":"uuid","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionIn"},"BucketPermissionOut":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionOut","description":"Schema for the bucket permissions."},"BucketPermissionParameters":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"}},"type":"object","required":["scopes"],"title":"BucketPermissionParameters","description":"Schema for the parameters of a bucket permission."},"BucketSizeLimits":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]}},"type":"object","title":"BucketSizeLimits","description":"Schema to represent bucket limits."},"BucketType":{"type":"string","enum":["OWN","ALL","PERMISSION"],"title":"BucketType","description":"Enumeration for the type of buckets to fetch from the DB\n\nOWN: Only fetch buckets that the user owns\nPERMISSION: Only fetch foreign buckets that the user has access to\nALL: Fetch all buckets that the user has access to"},"DevWorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"mode":{"anyOf":[{"$ref":"#/components/schemas/WorkflowModeIn"},{"type":"null"}],"description":"Mode of the workflow with an alternative entrypoint"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow execution requires"}},"type":"object","required":["parameters","git_commit_hash","repository_url","nextflow_version"],"title":"DevWorkflowExecutionIn"},"DocumentationEnum":{"type":"string","enum":["usage.md","input.md","output.md","changelog.md","parameter_schema.json","clowm_info.json","CITATIONS.md"],"title":"DocumentationEnum"},"FileTree":{"properties":{"type":{"type":"string","enum":["file","directory","link"],"title":"Type"},"name":{"type":"string","title":"Name"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"},"contents":{"anyOf":[{"items":{"$ref":"#/components/schemas/FileTree"},"type":"array"},{"type":"null"}],"title":"Contents"},"size":{"type":"integer","title":"Size"}},"type":"object","required":["type","name","size"],"title":"FileTree"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IconUpdateOut":{"properties":{"icon_url":{"type":"string","minLength":1,"format":"uri","title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["icon_url"],"title":"IconUpdateOut"},"InstanceSpecificDefaultParameters":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"}]},"type":"object"},"NewsIn":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event","default":"system"}},"type":"object","required":["content","title"],"title":"NewsIn"},"NewsOut":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event"},"news_id":{"type":"string","title":"News Id","description":"ID of the news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"]},"creator_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Id","description":"ID of the creator","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]}},"type":"object","required":["content","title","category","news_id","created_at"],"title":"NewsOut"},"NextflowVersion":{"type":"string","enum":["22.10.0","22.10.1","22.10.2","22.10.3","22.10.4","22.10.5","22.10.6","22.10.7","22.10.8","23.04.0","23.04.1","23.04.2","23.04.3","23.04.4","23.04.5","23.10.0","23.10.1","23.10.2","23.10.3","23.10.4","24.04.1","24.04.2","24.04.3","24.04.4","24.10.0"],"title":"NextflowVersion"},"OIDCProvider":{"type":"string","enum":["lifescience-aai","nfdi-aai"],"title":"OIDCProvider"},"OwnershipTransferRequestIn":{"properties":{"new_owner_uid":{"type":"string","format":"uuid","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Comment","description":"An optional comment for the transfer request","examples":["This is an example comment"]}},"type":"object","required":["new_owner_uid"],"title":"OwnershipTransferRequestIn"},"OwnershipTransferRequestOut":{"properties":{"new_owner_uid":{"type":"string","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"type":"string","title":"Comment","description":"An optional comment for the transfer request","default":"","examples":["This is an example comment"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Time when the ownership transfer was requested as UNIX timestamp","examples":[1640991600]},"current_owner_uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Owner Uid","description":"The current uid of the current owner if he exists","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"target_id":{"type":"string","title":"Target Id","description":"Id of the target that gets its ownership transferred"},"target_name":{"type":"string","title":"Target Name","description":"Name of the target","examples":["example-bucket","Example Workflow","Example Resource"]},"target_description":{"type":"string","title":"Target Description","description":"Description of then target","examples":["Some long description of a target"]},"target_type":{"$ref":"#/components/schemas/OwnershipTypeEnum","description":"Target type of the ownership transfer","examples":["bucket"]}},"type":"object","required":["new_owner_uid","created_at","target_id","target_name","target_description","target_type"],"title":"OwnershipTransferRequestOut"},"OwnershipTypeEnum":{"type":"string","enum":["bucket","workflow","resource"],"title":"OwnershipTypeEnum"},"ParameterExtension-Input":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterExtension-Output":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterVisibility":{"type":"integer","enum":[10,20,30,40],"title":"ParameterVisibility"},"ParameterVisibilityMapping":{"additionalProperties":{"$ref":"#/components/schemas/ParameterVisibility"},"type":"object"},"PermissionStatus":{"type":"string","enum":["ACTIVE","INACTIVE"],"title":"PermissionStatus","description":"Status of a bucket permission. Can be either `ACTIVE` or `INACTIVE`. A permission can only get `INACTIVE` if the\npermission itself has a time limit and the current time is not in the timespan."},"PublicWorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"latest_git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Latest Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"latest_version_tag":{"type":"string","maxLength":10,"minLength":5,"title":"Latest Version Tag","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"developer":{"type":"string","title":"Developer","description":"Name of the developer","default":"","examples":["Bilbo Baggins"]},"latest_version_timestamp":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Latest Version Timestamp","description":"Timestamp when the last version was created as UNIX timestamp","examples":[1640991600]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the workflow icon","readOnly":true,"examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["name","short_description","repository_url","workflow_id","latest_git_commit_hash","latest_version_tag","latest_version_timestamp","icon_url"],"title":"PublicWorkflowOut"},"ResourceIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true}},"type":"object","required":["release","name","description","source"],"title":"ResourceIn"},"ResourceOut":{"properties":{"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"maintainer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Maintainer Id","description":"ID of the maintainer","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"versions":{"items":{"$ref":"#/components/schemas/ResourceVersionOut"},"type":"array","title":"Versions","description":"Versions of the resource"}},"type":"object","required":["name","description","source","resource_id","maintainer_id","versions"],"title":"ResourceOut"},"ResourceVersionIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]}},"type":"object","required":["release"],"title":"ResourceVersionIn"},"ResourceVersionOut":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"status":{"$ref":"#/components/schemas/ResourceVersionStatus","description":"Status of the resource version"},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1672527600]},"compressed_size":{"type":"integer","maximum":1.8446744073709552e+19,"minimum":0.0,"title":"Compressed Size","description":"Size of the compressed resource in bytes","examples":[42097156608]},"cluster_path":{"type":"string","title":"Cluster Path","description":"Path to the resource on the cluster if the resource is synchronized","readOnly":true,"examples":["/vol/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4","/vol/resources/CLDB-0e240ccd/latest"]},"s3_path":{"type":"string","title":"S3 Path","description":"Path to the resource in the S3 Bucket. Not publicly available.","readOnly":true,"examples":["s3://clowm-data/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4/resource.tar.gz"]}},"type":"object","required":["release","status","resource_version_id","resource_id","created_at","compressed_size","cluster_path","s3_path"],"title":"ResourceVersionOut"},"ResourceVersionStatus":{"type":"string","enum":["RESOURCE_REQUESTED","WAIT_FOR_REVIEW","DENIED","APPROVED","SYNC_REQUESTED","SYNCHRONIZING","SYNC_ERROR","SYNCHRONIZED","SETTING_LATEST","LATEST","CLUSTER_DELETING","CLUSTER_DELETE_ERROR","S3_DELETING","S3_DELETE_ERROR","S3_DELETED"],"title":"ResourceVersionStatus","description":"Enumeration for the possible status of a resource version."},"RoleEnum":{"type":"string","enum":["administrator","user","reviewer","developer","db_maintainer"],"title":"RoleEnum"},"S3Key":{"properties":{"uid":{"type":"string","title":"Uid","description":"UID of the user of that access key","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"access_key":{"type":"string","title":"Access Key","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"]},"secret_key":{"type":"string","title":"Secret Key","description":"Secret of the S3 access key","examples":["2F5uNTI1qvt4oAroXV0wWct8rWclL2QvFXKqSqjS"]}},"type":"object","required":["uid","access_key","secret_key"],"title":"S3Key","description":"Schema for a S3 key associated with a user."},"UserIn":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","examples":[["user"]]},"email":{"type":"string","format":"email","title":"Email","description":"Email of the user","examples":["user@example.org"]}},"type":"object","required":["display_name","email"],"title":"UserIn"},"UserOut":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["display_name","uid"],"title":"UserOut","description":"Schema for a user."},"UserOutExtended":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]},"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"lifescience_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lifescience Id","description":"Lifesicence AAI ID of the user","examples":["18b59678f16d2c59306c0aedb1dc7ddcfe162456"]},"nfdi_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nfdi Id","description":"NFDI AAI ID of the user","examples":["18b59678f16d2c59306c0aedb1dc7ddcfe162456"]},"invitation_token_created_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invitation Token Created At","description":"Timestamp when the invitation token was created as UNIX timestamp"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email","description":"Email of the user","examples":["user@example.org"]},"gravatar_url":{"type":"string","minLength":1,"format":"uri","title":"Gravatar Url","description":"URL to the gravatar avatar based on the users email","readOnly":true,"examples":["https://gravatar.com/avatar/87a8c45825eb709ee8e453d2c0f8154e1b9bf4b45bb9b81b7662177340aa9d38"]}},"type":"object","required":["roles","display_name","uid","gravatar_url"],"title":"UserOutExtended"},"UserRequestAnswer":{"properties":{"deny":{"type":"boolean","title":"Deny","description":"Flag to indicate if the request was denied.","default":false},"reason":{"anyOf":[{"type":"string","maxLength":512,"minLength":16},{"type":"null"}],"title":"Reason","description":"Reason why the request was denied or approved. Required if request is denied."}},"type":"object","title":"UserRequestAnswer"},"UserRoles":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]}},"type":"object","required":["roles"],"title":"UserRoles"},"UserSynchronizationRequestIn":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]}},"type":"object","required":["reason"],"title":"UserSynchronizationRequestIn"},"UserSynchronizationRequestOut":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"requester_id":{"type":"string","title":"Requester Id","description":"ID of the user that requested this resource synchronization","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["reason","resource_version_id","resource_id","requester_id"],"title":"UserSynchronizationRequestOut"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WorkflowCredentialsIn":{"properties":{"token":{"type":"string","maxLength":128,"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","required":["token"],"title":"WorkflowCredentialsIn"},"WorkflowCredentialsOut":{"properties":{"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","title":"WorkflowCredentialsOut"},"WorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["parameters","workflow_version_id"],"title":"WorkflowExecutionIn"},"WorkflowExecutionOut":{"properties":{"workflow_version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"execution_id":{"type":"string","title":"Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"executor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executor Id","description":"UID of user who started the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"start_time":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Start Time","description":"Start time of the workflow execution as UNIX timestamp","examples":[1640991600]},"end_time":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"End Time","description":"End time of the workflow execution as UNIX timestamp","examples":[1640991600]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"Status of the workflow execution","examples":["RUNNING"]},"workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Id","description":"Id of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"logs_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where logs and reports are saved.","examples":["s3://example-bucket/logs/run-591b6a6ea1f0420d8a20a7a60704f695"]},"provenance_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where provenance information is saved.","examples":["s3://example-bucket/provenance/run-591b6a6ea1f0420d8a20a7a60704f695"]},"debug_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where debug information from Nextflow is saved.","examples":["s3://example-bucket/debug/run-591b6a6ea1f0420d8a20a7a60704f695"]},"cpu_time":{"type":"string","format":"duration","title":"Cpu Time","description":"The consumed cpu time in ISO 8601 format","examples":["P4DT12H30M5S"]}},"type":"object","required":["execution_id","start_time","status","cpu_time"],"title":"WorkflowExecutionOut"},"WorkflowExecutionStatus":{"type":"string","enum":["PENDING","SCHEDULED","RUNNING","CANCELED","SUCCESS","ERROR"],"title":"WorkflowExecutionStatus","description":"Enumeration for the status on a workflow execution."},"WorkflowIn":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"initial_version":{"type":"string","maxLength":10,"minLength":5,"title":"Initial Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","maxItems":10,"title":"Modes","description":"List of modes with alternative entrypoint the new workflow has","default":[]},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["name","short_description","repository_url","git_commit_hash","initial_version","nextflow_version"],"title":"WorkflowIn"},"WorkflowModeIn":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]}},"type":"object","required":["schema_path","entrypoint","name"],"title":"WorkflowModeIn"},"WorkflowModeOut":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]},"mode_id":{"type":"string","title":"Mode Id","description":"ID of the workflow mode","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["schema_path","entrypoint","name","mode_id"],"title":"WorkflowModeOut"},"WorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"versions":{"items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"type":"array","title":"Versions","description":"Versions of the workflow"},"developer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Developer Id","description":"ID of developer of the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"private":{"type":"boolean","title":"Private","description":"Flag if the workflow is hosted in a private git repository","default":false}},"type":"object","required":["name","short_description","repository_url","workflow_id","versions"],"title":"WorkflowOut"},"WorkflowStatistic":{"properties":{"day":{"type":"string","format":"date","title":"Day","description":"Day of the datapoint","examples":["2023-01-01"]},"count":{"type":"integer","title":"Count","description":"Number of started workflows on that day","examples":[1]}},"type":"object","required":["day","count"],"title":"WorkflowStatistic"},"WorkflowUpdate":{"properties":{"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"append_modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","title":"Append Modes","description":"Add modes to the new workflow version"},"delete_modes":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Delete Modes","description":"Delete modes for the new workflow version.","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["version","git_commit_hash"],"title":"WorkflowUpdate"},"WorkflowVersionMetadataIn":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataIn"},"WorkflowVersionMetadataOut":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataOut"},"WorkflowVersionOut":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the corresponding workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1640991600]},"modes":{"items":{"type":"string"},"type":"array","title":"Modes","description":"Optional modes his workflow version has","default":[],"examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"parameter_extension":{"anyOf":[{"$ref":"#/components/schemas/ParameterExtension-Output"},{"type":"null"}],"description":"Parameter extension specific for this CloWM instance"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["status","workflow_id","version","workflow_version_id","created_at","nextflow_version"],"title":"WorkflowVersionOut"},"WorkflowVersionStatus":{"type":"string","enum":["CREATED","DENIED","PUBLISHED","DEPRECATED"],"title":"WorkflowVersionStatus","description":"Enumeration for the possible status of a workflow version."},"WorkflowVersionStatusSchema":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]}},"type":"object","required":["status"],"title":"WorkflowVersionStatusSchema"}},"securitySchemes":{"Session Token":{"type":"apiKey","description":"The JWT in this cookie is used by the website and should not be used when communicating directly with the API.","in":"cookie","name":"clowm-jwt"}}}} \ No newline at end of file +{ + "openapi": "3.1.0", + "info": { + "title": "CloWM UI API", + "description": "This is the API for the CloWM UI. It is only for internal use and will change without prior notice.", + "version": "1.0" + }, + "servers": [{ "url": "/api" }], + "paths": { + "/auth/login/{provider}": { + "get": { + "tags": ["Auth"], + "summary": "Kickstart the login flow", + "description": "Redirect route to OIDC provider to kickstart the login process.", + "operationId": "Auth-kickstart_login", + "parameters": [ + { + "name": "provider", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/OIDCProvider", + "description": "The OIDC provider to use for login" + }, + "description": "The OIDC provider to use for login" + }, + { + "name": "invitation_token", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "minLength": 43, "maxLength": 43 }, + { "type": "null" } + ], + "description": "Unique token to validate an invitation", + "title": "Invitation Token" + }, + "description": "Unique token to validate an invitation" + }, + { + "name": "next", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "maxLength": 128 }, + { "type": "null" } + ], + "description": "Will be appended to redirect response in the callback route as URL query parameter `next`", + "title": "Next" + }, + "description": "Will be appended to redirect response in the callback route as URL query parameter `next`" + } + ], + "responses": { + "302": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/auth/login/callback/{provider}": { + "get": { + "tags": ["Auth"], + "summary": "LifeScience Login Callback", + "description": "Callback for the login process with an OIDC Provider.\n\nVisit the route login route to start the login process.\n\nIf the user is already known to the system, then a JWT token will be created and sent via the 'set-cookie' header.\nThe key for this Cookie is 'bearer'.\n\nIf the user is new, he will be created him and then a JWT token is issued.\n\nThis JWT has to be sent to all authorized endpoints via the HTTPBearer scheme.", + "operationId": "Auth-login_callback", + "parameters": [ + { + "name": "provider", + "in": "path", + "required": true, + "schema": { "$ref": "#/components/schemas/OIDCProvider" } + } + ], + "responses": { + "302": { + "description": "Successful Response", + "headers": { + "Set-Cookie": { + "description": "JWT for accessing the API", + "schema": { + "type": "string", + "example": "clowm-jwt=fake-jwt-cookie; Domain=localhost; Max-Age=691200; Path=/; SameSite=strict; Secure" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/auth/account/connect/{provider}": { + "get": { + "tags": ["Auth"], + "summary": "Kickstart the account connection flow", + "description": "Redirect route to OIDC provider to connect the CloWM account with the AAI account.", + "operationId": "Auth-kickstart_account_connection", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "provider", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/OIDCProvider", + "description": "The OIDC provider to use for login" + }, + "description": "The OIDC provider to use for login" + } + ], + "responses": { + "302": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/auth/account/callback/{provider}": { + "get": { + "tags": ["Auth"], + "summary": "LifeScience Login Callback", + "description": "Callback for the account connection process with an OIDC provider.", + "operationId": "Auth-account_connection_callback", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "provider", + "in": "path", + "required": true, + "schema": { "$ref": "#/components/schemas/OIDCProvider" } + } + ], + "responses": { + "302": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/auth/logout": { + "get": { + "tags": ["Auth"], + "summary": "Logout", + "description": "Logout the user from the system by deleting the bearer cookie.", + "operationId": "Auth-logout", + "responses": { + "302": { + "description": "Successful Response", + "headers": { + "Set-Cookie": { + "description": "JWT for accessing the API", + "schema": { + "type": "string", + "example": "clowm-jwt=; Domain=localhost; Max-Age=0; Path=/; SameSite=strict; Secure" + } + } + } + } + } + } + }, + "/ui/tokens": { + "get": { + "tags": ["APIToken"], + "summary": "List API token", + "description": "List meta information about all API token.\n\nPermissions `api_token:list_all` required. See parameter `uid` for exception.", + "operationId": "APIToken-list_token", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "uid", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "description": "UID of the user to filter for. Permission `api_token:list` required if current users is the target.", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Uid" + }, + "description": "UID of the user to filter for. Permission `api_token:list` required if current users is the target." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/ApiTokenOut" }, + "title": "Response Apitoken-List Token" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "post": { + "tags": ["APIToken"], + "summary": "Create new API token", + "description": "Create a new API token for the current user.\n\nPermission `api_token:create` required.", + "operationId": "APIToken-create_token", + "security": [{ "Session Token": [] }], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiTokenIn", + "description": "Meta-data for Api token to create" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ApiTokenPrivateOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/tokens/{tid}": { + "get": { + "tags": ["APIToken"], + "summary": "Get API token", + "description": "Get an API token by id.\n\nPermission `api_token:read` required if the current user is the owner of the API token,\notherwise `api_token:read_any` required.", + "operationId": "APIToken-get_token", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "tid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of an API token", + "examples": ["b4c861a7-7f52-4332-a001-78e0500dabbc"], + "title": "Tid" + }, + "description": "ID of an API token" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ApiTokenOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "delete": { + "tags": ["APIToken"], + "summary": "Delete API token", + "description": "Delete an API token by id.\n\nPermission `api_token:delete` required if the current user is the owner of the API token,\notherwise `api_token:delete_any` required.", + "operationId": "APIToken-delete_token", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "tid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of an API token", + "examples": ["b4c861a7-7f52-4332-a001-78e0500dabbc"], + "title": "Tid" + }, + "description": "ID of an API token" + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/users": { + "post": { + "tags": ["User"], + "summary": "Create User", + "description": "Create a new user in the system and notify him.\n\nPermission `user:create` required.", + "operationId": "User-create_user", + "security": [{ "Session Token": [] }], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserIn", + "description": "Meta-data for user to create" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/UserOutExtended" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "get": { + "tags": ["User"], + "summary": "List users and search by their name", + "description": "List all users in the system..\n\nPermission `user:list` required.", + "operationId": "User-list_users", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "name_substring", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "minLength": 3, "maxLength": 30 }, + { "type": "null" } + ], + "description": "Filter users by a substring in their name.", + "examples": ["Bilbo"], + "title": "Name Substring" + }, + "description": "Filter users by a substring in their name." + }, + { + "name": "filter_roles", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { "$ref": "#/components/schemas/RoleEnum" } + }, + { "type": "null" } + ], + "description": "Filter users by their role. If multiple are selected, they are concatenating by an OR Expression.", + "title": "Filter Roles" + }, + "description": "Filter users by their role. If multiple are selected, they are concatenating by an OR Expression." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/UserOutExtended" }, + "title": "Response User-List Users" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/users/search": { + "get": { + "tags": ["User"], + "summary": "Search Users", + "description": "Search for users in the system by their name.\n\nPermission `user: search` required.", + "operationId": "User-search_users", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "name_substring", + "in": "query", + "required": true, + "schema": { + "type": "string", + "minLength": 3, + "maxLength": 30, + "description": "Filter users by a substring in their name.", + "title": "Name Substring" + }, + "description": "Filter users by a substring in their name." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/UserOut" }, + "title": "Response User-Search Users" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/users/me": { + "get": { + "tags": ["User"], + "summary": "Get the logged in user", + "description": "Return the user associated with the used JWT.\n\nPermission `user:read` required.", + "operationId": "User-get_logged_in_user", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/UserOutExtended" } + } + } + } + }, + "security": [{ "Session Token": [] }] + } + }, + "/ui/users/{uid}": { + "get": { + "tags": ["User"], + "summary": "Get a user by its uid", + "description": "Return the user with the specific uid.\n\nPermission `user:read` required.", + "operationId": "User-get_user", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "uid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "UID of a user", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Uid" + }, + "description": "UID of a user" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/UserOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "delete": { + "tags": ["User"], + "summary": "Delete a user", + "description": "Delete a user and his S3 account.\n\nPermission `user:delete` required if the current user is the target user.", + "operationId": "User-delete_user", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "uid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "UID of a user", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Uid" + }, + "description": "UID of a user" + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/users/{uid}/roles": { + "put": { + "tags": ["User"], + "summary": "Update user roles", + "description": "Update the roles of a user.\n\nPermission `user:update` required.", + "operationId": "User-update_roles", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "uid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "UID of a user", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Uid" + }, + "description": "UID of a user" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRoles", + "description": "The new roles of the user" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/UserOutExtended" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/users/{uid}/invitation": { + "patch": { + "tags": ["User"], + "summary": "Resend Invitation", + "description": "Resend the invitation link for an user that has an open invitation.\n\nPermission `user:create` required.", + "operationId": "User-resend_invitation", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "uid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "UID of a user", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Uid" + }, + "description": "UID of a user" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/UserOutExtended" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/users/{uid}/keys": { + "get": { + "tags": ["S3Key"], + "summary": "Get the S3 Access keys from a user", + "description": "Get all the S3 Access keys for a specific user.\n\nPermission `s3_key:list` required if the current user is the target, otherwise `s3_key:list_all` required.", + "operationId": "S3Key-get_user_keys", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "uid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "UID of a user", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Uid" + }, + "description": "UID of a user" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/S3Key" }, + "title": "Response S3Key-Get User Keys" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "post": { + "tags": ["S3Key"], + "summary": "Create a Access key for a user", + "description": "Create a S3 Access key for a specific user.\n\nPermission `s3_key:create` required if the current user is the target, otherwise `s3_key:create_any` required.", + "operationId": "S3Key-create_user_key", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "uid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "UID of a user", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Uid" + }, + "description": "UID of a user" + } + ], + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/S3Key" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/users/{uid}/keys/{access_id}": { + "get": { + "tags": ["S3Key"], + "summary": "Get a specific S3 Access key from a user", + "description": "Get a specific S3 Access Key for a specific user.\n\nPermission `s3_key:read` required if the current user is the target, otherwise `s3_key:read_any` required.", + "operationId": "S3Key-get_user_key", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "access_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "ID of the S3 access key", + "examples": ["CRJ6B037V2ZT4U3W17VC"], + "title": "Access Id" + }, + "description": "ID of the S3 access key" + }, + { + "name": "uid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "UID of a user", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Uid" + }, + "description": "UID of a user" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/S3Key" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "delete": { + "tags": ["S3Key"], + "summary": "Delete a specific S3 Access key from a user", + "description": "Delete a specific S3 Access key for a specific user.\n\nPermission `s3_key:delete` required if the current user is the target, otherwise `s3_key:delete_any` required.", + "operationId": "S3Key-delete_user_key", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "access_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "ID of the S3 access key", + "examples": ["CRJ6B037V2ZT4U3W17VC"], + "title": "Access Id" + }, + "description": "ID of the S3 access key" + }, + { + "name": "uid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "UID of a user", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Uid" + }, + "description": "UID of a user" + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/buckets": { + "get": { + "tags": ["Bucket"], + "summary": "List buckets", + "description": "List all the buckets in the system or of the desired user where the user has permissions for.\n\nPermission `bucket:list_all` required. See parameter `owner_id` for exception.", + "operationId": "Bucket-list_buckets", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "owner_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "description": "UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target.", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Owner Id" + }, + "description": "UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target." + }, + { + "name": "bucket_type", + "in": "query", + "required": false, + "schema": { + "$ref": "#/components/schemas/BucketType", + "description": "Type of the bucket to get. Ignored when `user` parameter not set", + "default": "ALL" + }, + "description": "Type of the bucket to get. Ignored when `user` parameter not set" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/BucketOut" }, + "title": "Response Bucket-List Buckets" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "post": { + "tags": ["Bucket"], + "summary": "Create a bucket for the current user", + "description": "Create a bucket for the current user.\n\nThe name of the bucket has some constraints.\nFor more information see the\n[Ceph documentation](https://docs.ceph.com/en/quincy/radosgw/s3/bucketops/#constraints)\n\nPermission `bucket:create` required.", + "operationId": "Bucket-create_bucket", + "security": [{ "Session Token": [] }], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BucketIn", + "description": "Meta-data for bucket to create" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/BucketOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/buckets/ownership_transfer_request": { + "get": { + "tags": ["Bucket"], + "summary": "List bucket OTRs", + "description": "Get the ownership transfer requests for buckets.\n\nPermission `bucket:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `bucket:list_all`", + "operationId": "Bucket-list_bucket_otrs", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "current_owner_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "description": "UID of user who is the current owner.", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Current Owner Id" + }, + "description": "UID of user who is the current owner." + }, + { + "name": "new_owner_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "description": "UID of user who will be the new owner.", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "New Owner Id" + }, + "description": "UID of user who will be the new owner." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OwnershipTransferRequestOut" + }, + "title": "Response Bucket-List Bucket Otrs" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/buckets/{bucket_name}": { + "get": { + "tags": ["Bucket"], + "summary": "Get a bucket by its name", + "description": "Get a bucket by its name if the current user has READ permissions for the bucket.\n\nPermission `bucket:read` required if the current user is the owner of the bucket,\notherwise `bucket:read_any` required.", + "operationId": "Bucket-get_bucket", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "bucket_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 3, + "maxLength": 63, + "description": "Name of a bucket", + "examples": ["test-bucket"], + "title": "Bucket Name" + }, + "description": "Name of a bucket" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/BucketOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "delete": { + "tags": ["Bucket"], + "summary": "Delete a bucket", + "description": "Delete a bucket by its name. Only the owner of the bucket can delete the bucket.\n\nPermission `bucket:delete` required if the current user is the owner of the bucket,\notherwise `bucket:delete_any` required.", + "operationId": "Bucket-delete_bucket", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "bucket_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 3, + "maxLength": 63, + "description": "Name of a bucket", + "examples": ["test-bucket"], + "title": "Bucket Name" + }, + "description": "Name of a bucket" + }, + { + "name": "force_delete", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Delete even non-empty bucket", + "default": false, + "title": "Force Delete" + }, + "description": "Delete even non-empty bucket" + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/buckets/{bucket_name}/ownership_transfer_request": { + "get": { + "tags": ["Bucket"], + "summary": "Get a bucket OTR", + "description": "Get a specific bucket ownership transfer request.\n\nPermission `bucket:read` required if the current user is the current or new owner of the bucket,\notherwise `bucket:read_any` required.", + "operationId": "Bucket-get_bucket_otr", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "bucket_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 3, + "maxLength": 63, + "description": "Name of a bucket", + "examples": ["test-bucket"], + "title": "Bucket Name" + }, + "description": "Name of a bucket" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OwnershipTransferRequestOut" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "post": { + "tags": ["Bucket"], + "summary": "Create a bucket OTR", + "description": "Create a ownership transfer request for a specific bucket.\n\nPermission `bucket:update` required if the current user is the current owner of the bucket,\notherwise `bucket:update_any` required.", + "operationId": "Bucket-create_bucket_otr", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "bucket_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 3, + "maxLength": 63, + "description": "Name of a bucket", + "examples": ["test-bucket"], + "title": "Bucket Name" + }, + "description": "Name of a bucket" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OwnershipTransferRequestIn", + "description": "Meta-data for the bucket OTR to create" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OwnershipTransferRequestOut" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "patch": { + "tags": ["Bucket"], + "summary": "Accept a bucket OTR", + "description": "Accept an ownership transfer request for a specific workflow.\n\nPermission `bucket:update` required if the current user is the new owner of the workflow,\notherwise `bucket:update_any` required.", + "operationId": "Bucket-accept_bucket_otr", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "bucket_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 3, + "maxLength": 63, + "description": "Name of a bucket", + "examples": ["test-bucket"], + "title": "Bucket Name" + }, + "description": "Name of a bucket" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/BucketOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "delete": { + "tags": ["Bucket"], + "summary": "Delete a bucket OTR", + "description": "Delete/Reject a bucket ownership transfer request.\n\nPermission `bucket:update` required if the current user is the current or new owner of the bucket,\notherwise `bucket:update_any` required.", + "operationId": "Bucket-delete_bucket_otr", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "bucket_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 3, + "maxLength": 63, + "description": "Name of a bucket", + "examples": ["test-bucket"], + "title": "Bucket Name" + }, + "description": "Name of a bucket" + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/buckets/{bucket_name}/public": { + "patch": { + "tags": ["Bucket"], + "summary": "Update public status", + "description": "Update the buckets public state.\n\nPermission `bucket:update` required if the current user is the owner of the bucket,\notherwise `bucket:update_any` required.", + "operationId": "Bucket-update_bucket_public_state", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "bucket_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 3, + "maxLength": 63, + "description": "Name of a bucket", + "examples": ["test-bucket"], + "title": "Bucket Name" + }, + "description": "Name of a bucket" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_Bucket-update_bucket_public_state" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/BucketOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/buckets/{bucket_name}/limits": { + "patch": { + "tags": ["Bucket"], + "summary": "Update bucket limits", + "description": "Update the buckets size limits.\n\nPermission `bucket:update_any` required.", + "operationId": "Bucket-update_bucket_limits", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "bucket_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 3, + "maxLength": 63, + "description": "Name of a bucket", + "examples": ["test-bucket"], + "title": "Bucket Name" + }, + "description": "Name of a bucket" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BucketSizeLimits", + "description": "New size limits for bucket" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/BucketOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/permissions": { + "get": { + "tags": ["BucketPermission"], + "summary": "Get all permissions.", + "description": "List all the bucket permissions in the system.\n\nPermission `bucket_permission:list_all` required.", + "operationId": "BucketPermission-list_permissions", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "permission_scopes", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { "enum": ["read", "write"], "type": "string" } + }, + { "type": "null" } + ], + "description": "Scopes of Bucket Permissions to fetch", + "title": "Permission Scopes" + }, + "description": "Scopes of Bucket Permissions to fetch" + }, + { + "name": "permission_status", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "$ref": "#/components/schemas/PermissionStatus" }, + { "type": "null" } + ], + "description": "Status of Bucket Permissions to fetch", + "title": "Permission Status" + }, + "description": "Status of Bucket Permissions to fetch" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BucketPermissionOut" + }, + "title": "Response Bucketpermission-List Permissions" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "post": { + "tags": ["BucketPermission"], + "summary": "Create a permission.", + "description": "Create a permission for a bucket and user.\n\nPermission `bucket_permission:create` required.", + "operationId": "BucketPermission-create_permission", + "security": [{ "Session Token": [] }], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BucketPermissionIn", + "description": "Permission to create" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/BucketPermissionOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/permissions/user/{uid}": { + "get": { + "tags": ["BucketPermission"], + "summary": "Get all permissions for a user.", + "description": "List all the bucket permissions for the given user.\n\nPermission `bucket_permission:list` required if current user is the target the bucket permission,\notherwise `bucket_permission:list_all` required.", + "operationId": "BucketPermission-list_permissions_per_user", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "uid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "UID of a user", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Uid" + }, + "description": "UID of a user" + }, + { + "name": "permission_scopes", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { "enum": ["read", "write"], "type": "string" } + }, + { "type": "null" } + ], + "description": "Scopes of Bucket Permissions to fetch", + "title": "Permission Scopes" + }, + "description": "Scopes of Bucket Permissions to fetch" + }, + { + "name": "permission_status", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "$ref": "#/components/schemas/PermissionStatus" }, + { "type": "null" } + ], + "description": "Status of Bucket Permissions to fetch", + "title": "Permission Status" + }, + "description": "Status of Bucket Permissions to fetch" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BucketPermissionOut" + }, + "title": "Response Bucketpermission-List Permissions Per User" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/permissions/bucket/{bucket_name}": { + "get": { + "tags": ["BucketPermission"], + "summary": "Get all permissions for a bucket.", + "description": "List all the bucket permissions for the given bucket.\n\nPermission `bucket_permission:list` required if current user is owner of the bucket,\notherwise `bucket_permission:list_all` required.", + "operationId": "BucketPermission-list_permissions_per_bucket", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "bucket_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 3, + "maxLength": 63, + "description": "Name of a bucket", + "examples": ["test-bucket"], + "title": "Bucket Name" + }, + "description": "Name of a bucket" + }, + { + "name": "permission_scopes", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { "enum": ["read", "write"], "type": "string" } + }, + { "type": "null" } + ], + "description": "Scopes of Bucket Permissions to fetch", + "title": "Permission Scopes" + }, + "description": "Scopes of Bucket Permissions to fetch" + }, + { + "name": "permission_status", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "$ref": "#/components/schemas/PermissionStatus" }, + { "type": "null" } + ], + "description": "Status of Bucket Permissions to fetch", + "title": "Permission Status" + }, + "description": "Status of Bucket Permissions to fetch" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BucketPermissionOut" + }, + "title": "Response Bucketpermission-List Permissions Per Bucket" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/permissions/bucket/{bucket_name}/user/{uid}": { + "get": { + "tags": ["BucketPermission"], + "summary": "Get permission for bucket and user combination.", + "description": "Get the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:read` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:read_any` required.", + "operationId": "BucketPermission-get_permission", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "bucket_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 3, + "maxLength": 63, + "description": "Name of a bucket", + "examples": ["test-bucket"], + "title": "Bucket Name" + }, + "description": "Name of a bucket" + }, + { + "name": "uid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "UID of a user", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Uid" + }, + "description": "UID of a user" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/BucketPermissionOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "put": { + "tags": ["BucketPermission"], + "summary": "Update a bucket permission", + "description": "Update a permission for a bucket and user.\n\nPermission `bucket_permission:update` required.", + "operationId": "BucketPermission-update_permission", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "bucket_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 3, + "maxLength": 63, + "description": "Name of a bucket", + "examples": ["test-bucket"], + "title": "Bucket Name" + }, + "description": "Name of a bucket" + }, + { + "name": "uid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "UID of a user", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Uid" + }, + "description": "UID of a user" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BucketPermissionParameters", + "description": "Permission to create" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/BucketPermissionOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "delete": { + "tags": ["BucketPermission"], + "summary": "Delete a bucket permission", + "description": "Delete the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:delete` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:delete_any` required.", + "operationId": "BucketPermission-delete_permission", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "bucket_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 3, + "maxLength": 63, + "description": "Name of a bucket", + "examples": ["test-bucket"], + "title": "Bucket Name" + }, + "description": "Name of a bucket" + }, + { + "name": "uid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "UID of a user", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Uid" + }, + "description": "UID of a user" + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflows": { + "post": { + "tags": ["Workflow"], + "summary": "Create a new workflow", + "description": "Create a new workflow.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.", + "operationId": "Workflow-create_workflow", + "security": [{ "Session Token": [] }], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowIn", + "description": "Meta-date for the workflow to create" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/WorkflowOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "get": { + "tags": ["Workflow"], + "summary": "List workflows", + "description": "List all workflows.\n\nPermission `workflow:list` required.", + "operationId": "Workflow-list_workflows", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "name_substring", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "minLength": 3, "maxLength": 30 }, + { "type": "null" } + ], + "description": "Filter workflows by a substring in their name.", + "examples": ["blast"], + "title": "Name Substring" + }, + "description": "Filter workflows by a substring in their name." + }, + { + "name": "version_status", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkflowVersionStatus" + } + }, + { "type": "null" } + ], + "description": "Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`.", + "title": "Version Status" + }, + "description": "Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`." + }, + { + "name": "developer_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "description": "Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`.", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Developer Id" + }, + "description": "Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/WorkflowOut" }, + "title": "Response Workflow-List Workflows" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflows/ownership_transfer_request": { + "get": { + "tags": ["Workflow"], + "summary": "List workflow OTRs", + "description": "Get the ownership transfer requests for workflows.\n\nPermission `workflow:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `workflow:list_all`", + "operationId": "Workflow-list_workflow_otrs", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "current_owner_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "description": "UID of user who is the current owner.", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Current Owner Id" + }, + "description": "UID of user who is the current owner." + }, + { + "name": "new_owner_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "description": "UID of user who will be the new owner.", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "New Owner Id" + }, + "description": "UID of user who will be the new owner." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OwnershipTransferRequestOut" + }, + "title": "Response Workflow-List Workflow Otrs" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflows/developer_statistics": { + "get": { + "tags": ["Workflow"], + "summary": "Get anonymized workflow execution", + "description": "Get the workflow executions with meta information and anonymized user IDs.\n\nPermission `workflow:read` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:read_any`.", + "operationId": "Workflow-get_developer_workflow_statistics", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "developer_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "description": "Filter by the developer of the workflows", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Developer Id" + }, + "description": "Filter by the developer of the workflows" + }, + { + "name": "workflow_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { "type": "string", "format": "uuid" } + }, + { "type": "null" } + ], + "description": "Filter by workflow IDs", + "title": "Workflow Id" + }, + "description": "Filter by workflow IDs" + }, + { + "name": "start", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "date" }, + { "type": "null" } + ], + "description": "Filter by workflow executions after this date", + "title": "Start" + }, + "description": "Filter by workflow executions after this date" + }, + { + "name": "end", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "date" }, + { "type": "null" } + ], + "description": "Filter by workflow executions before this date", + "title": "End" + }, + "description": "Filter by workflow executions before this date" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AnonymizedWorkflowExecution" + }, + "title": "Response Workflow-Get Developer Workflow Statistics" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflows/{wid}": { + "get": { + "tags": ["Workflow"], + "summary": "Get a workflow", + "description": "Get a specific workflow.\n\nPermission `workflow:read` required.", + "operationId": "Workflow-get_workflow", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + }, + { + "name": "version_status", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkflowVersionStatus" + } + }, + { "type": "null" } + ], + "description": "Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`", + "title": "Version Status" + }, + "description": "Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/WorkflowOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "delete": { + "tags": ["Workflow"], + "summary": "Delete a workflow", + "description": "Delete a workflow.\n\nPermission `workflow:delete` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:delete_any`.", + "operationId": "Workflow-delete_workflow", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflows/{wid}/ownership_transfer_request": { + "get": { + "tags": ["Workflow"], + "summary": "Get a workflow OTR", + "description": "Get a specific workflow ownership transfer request.\n\nPermission `workflow:read` required if current user is the current or new owner of the workflow,\notherwise `workflow:read_any` required.", + "operationId": "Workflow-get_workflow_otr", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OwnershipTransferRequestOut" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "post": { + "tags": ["Workflow"], + "summary": "Create a workflow OTR", + "description": "Create a ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the current owner of the workflow,\notherwise `workflow:update_any` required.", + "operationId": "Workflow-create_workflow_otr", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OwnershipTransferRequestIn", + "description": "Meta-data for workflow OTR to create" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OwnershipTransferRequestOut" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "patch": { + "tags": ["Workflow"], + "summary": "Accept a workflow OTR", + "description": "Accept an ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the new owner of the workflow,\notherwise `workflow:update_any` required.", + "operationId": "Workflow-accept_workflow_otr", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/WorkflowOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "delete": { + "tags": ["Workflow"], + "summary": "Delete a workflow OTR", + "description": "Delete/Reject a workflow ownership transfer request.\n\nPermission `workflow:update` required if current user is the current or new owner of the workflow,\notherwise `workflow:update_any` required.", + "operationId": "Workflow-delete_workflow_otr", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflows/{wid}/statistics": { + "get": { + "tags": ["Workflow"], + "summary": "Get statistics for a workflow", + "description": "Get the number of started workflow per day.\n\nPermission `workflow:read` required.", + "operationId": "Workflow-get_workflow_statistics", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/WorkflowStatistic" }, + "title": "Response Workflow-Get Workflow Statistics" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflows/{wid}/update": { + "post": { + "tags": ["Workflow"], + "summary": "Update a workflow", + "description": "Create a new workflow version.\n\nPermission `workflow:update` required.", + "operationId": "Workflow-update_workflow", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowUpdate", + "description": "Meta-data for the workflow version to create" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/WorkflowVersionOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflows/{wid}/versions": { + "get": { + "tags": ["Workflow Version"], + "summary": "Get all versions of a workflow", + "description": "List all versions of a Workflow.\n\nPermission `workflow:list` required.", + "operationId": "Workflow Version-list_workflow_version", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + }, + { + "name": "version_status", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkflowVersionStatus" + } + }, + { "type": "null" } + ], + "description": "Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`", + "title": "Version Status" + }, + "description": "Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkflowVersionOut" + }, + "title": "Response Workflow Version-List Workflow Version" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflows/{wid}/versions/{git_commit_hash}": { + "get": { + "tags": ["Workflow Version"], + "summary": "Get a workflow version", + "description": "Get a specific version of a workflow.\n\nPermission `workflow:read` required if the version is public or you are the developer of the workflow,\notherwise `workflow:read_any`", + "operationId": "Workflow Version-get_workflow_version", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "git_commit_hash", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^([0-9a-f]{40}|latest)$", + "description": "Git commit `git_commit_hash` of specific version or `latest`.", + "examples": [ + "latest", + "ba8bcd9294c2c96aedefa1763a84a18077c50c0f" + ], + "title": "Git Commit Hash" + }, + "description": "Git commit `git_commit_hash` of specific version or `latest`." + }, + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/WorkflowVersionOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflows/{wid}/versions/{git_commit_hash}/status": { + "patch": { + "tags": ["Workflow Version"], + "summary": "Update status of workflow version", + "description": "Update the status of a workflow version.\n\nPermission `workflow:update_status`", + "operationId": "Workflow Version-update_workflow_version_status", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + }, + { + "name": "git_commit_hash", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 40, + "pattern": "^([0-9a-f]{40}|latest)$", + "description": "Git commit git_commit_hash of specific version.", + "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"], + "title": "Git Commit Hash" + }, + "description": "Git commit git_commit_hash of specific version." + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowVersionStatusSchema", + "description": "New Status of the workflow version" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/WorkflowVersionOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflows/{wid}/versions/{git_commit_hash}/metadata": { + "get": { + "tags": ["Workflow Version"], + "summary": "Get metadata of workflow version", + "description": "Get the metadata of a workflow version.\n\nPermission `workflow:read` required if the current user is the developer of the workflow,\notherwise `workflow:read_any`", + "operationId": "Workflow Version-get_workflow_version_metadata", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + }, + { + "name": "git_commit_hash", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 40, + "pattern": "^([0-9a-f]{40}|latest)$", + "description": "Git commit git_commit_hash of specific version.", + "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"], + "title": "Git Commit Hash" + }, + "description": "Git commit git_commit_hash of specific version." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowVersionMetadataOut" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "put": { + "tags": ["Workflow Version"], + "summary": "Update metadata of workflow version", + "description": "Update the metadata of a workflow version.\n\nPermission `workflow:update` required if the current user is the developer of the workflow,\notherwise `workflow:update_any`", + "operationId": "Workflow Version-update_workflow_version_metadata", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + }, + { + "name": "git_commit_hash", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 40, + "pattern": "^([0-9a-f]{40}|latest)$", + "description": "Git commit git_commit_hash of specific version.", + "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"], + "title": "Git Commit Hash" + }, + "description": "Git commit git_commit_hash of specific version." + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowVersionMetadataIn" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowVersionMetadataOut" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflows/{wid}/versions/{git_commit_hash}/deprecate": { + "patch": { + "tags": ["Workflow Version"], + "summary": "Deprecate a workflow version", + "description": "Deprecate a workflow version.\n\nPermission `workflow:update` required if you are the developer of the workflow,\notherwise `workflow:update_status`", + "operationId": "Workflow Version-deprecate_workflow_version", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + }, + { + "name": "git_commit_hash", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 40, + "pattern": "^([0-9a-f]{40}|latest)$", + "description": "Git commit git_commit_hash of specific version.", + "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"], + "title": "Git Commit Hash" + }, + "description": "Git commit git_commit_hash of specific version." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/WorkflowVersionOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflows/{wid}/versions/{git_commit_hash}/parameter-extension": { + "patch": { + "tags": ["Workflow Version"], + "summary": "Update parameter extension of workflow version", + "description": "Update the parameter extension of a workflow version.\n\nPermission `workflow:update` required.", + "operationId": "Workflow Version-update_workflow_version_parameter_extension", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + }, + { + "name": "git_commit_hash", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 40, + "pattern": "^([0-9a-f]{40}|latest)$", + "description": "Git commit git_commit_hash of specific version.", + "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"], + "title": "Git Commit Hash" + }, + "description": "Git commit git_commit_hash of specific version." + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ParameterExtension-Input", + "description": "Parameter extension specific for this CloWM instance" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/WorkflowVersionOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflows/{wid}/versions/{git_commit_hash}/documentation": { + "get": { + "tags": ["Workflow Version"], + "summary": "Fetch documentation for a workflow version", + "description": "Get the documentation for a specific workflow version.\nStreams the response directly from the right git repository.\n\nPermission `workflow:read` required.", + "operationId": "Workflow Version-download_workflow_documentation", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + }, + { + "name": "git_commit_hash", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 40, + "pattern": "^([0-9a-f]{40}|latest)$", + "description": "Git commit git_commit_hash of specific version.", + "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"], + "title": "Git Commit Hash" + }, + "description": "Git commit git_commit_hash of specific version." + }, + { + "name": "document", + "in": "query", + "required": false, + "schema": { + "$ref": "#/components/schemas/DocumentationEnum", + "description": "Specify which type of documentation the client wants to fetch", + "default": "usage.md" + }, + "description": "Specify which type of documentation the client wants to fetch" + }, + { + "name": "mode_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "description": "Workflow Mode", + "examples": ["8d47e878-f25f-41aa-b4a0-95d426b46f45"], + "title": "Mode Id" + }, + "description": "Workflow Mode" + } + ], + "responses": { + "200": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflows/{wid}/versions/{git_commit_hash}/icon": { + "post": { + "tags": ["Workflow Version"], + "summary": "Upload icon for workflow version", + "description": "Upload an icon for the workflow version and returns the new icon URL.\n\nPermission `workflow:update` required.", + "operationId": "Workflow Version-upload_workflow_version_icon", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + }, + { + "name": "git_commit_hash", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 40, + "pattern": "^([0-9a-f]{40}|latest)$", + "description": "Git commit git_commit_hash of specific version.", + "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"], + "title": "Git Commit Hash" + }, + "description": "Git commit git_commit_hash of specific version." + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Body_Workflow_Version-upload_workflow_version_icon" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/IconUpdateOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "delete": { + "tags": ["Workflow Version"], + "summary": "Delete icon of workflow version", + "description": "Delete the icon of the workflow version.\n\nPermission `workflow:update` required.", + "operationId": "Workflow Version-delete_workflow_version_icon", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + }, + { + "name": "git_commit_hash", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 40, + "pattern": "^([0-9a-f]{40}|latest)$", + "description": "Git commit git_commit_hash of specific version.", + "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"], + "title": "Git Commit Hash" + }, + "description": "Git commit git_commit_hash of specific version." + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflow_executions": { + "post": { + "tags": ["Workflow Execution"], + "summary": "Start a new workflow execution", + "description": "Start a new workflow execution. Workflow versions wit status `DEPRECATED` or `DENIED` can't be started.\n\nPermission `workflow_execution:create` required if workflow versions status is `PUBLISHED`,\notherwise `workflow_execution:create_any` required.", + "operationId": "Workflow Execution-start_workflow", + "security": [{ "Session Token": [] }], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowExecutionIn", + "description": "Meta-data and parameters for the workflow to start" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowExecutionOut" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "get": { + "tags": ["Workflow Execution"], + "summary": "List all workflow executions", + "description": "Get all workflow executions.\n\nThis endpoint enforces keyset pagination. To iterate over all workflow executions, follow the link provided in the\n`Link` header.\nA missing `Link` header indicates that you iterated over all workflow executions with the current filters.\n\nPermission `workflow_execution:list` required, if `executor_id` is the same as the current user,\notherwise `workflow_execution:list_all` required.", + "operationId": "Workflow Execution-list_workflow_executions", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "executor_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "description": "Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required.", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Executor Id" + }, + "description": "Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required." + }, + { + "name": "execution_status", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkflowExecutionStatus" + } + }, + { "type": "null" } + ], + "description": "Filter for status of workflow execution", + "title": "Execution Status" + }, + "description": "Filter for status of workflow execution" + }, + { + "name": "workflow_version_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "minLength": 40, + "maxLength": 40, + "pattern": "^[0-9a-f]+$" + }, + { "type": "null" } + ], + "description": "Filter for workflow version", + "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"], + "title": "Workflow Version Id" + }, + "description": "Filter for workflow version" + }, + { + "name": "workflow_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "description": "Filter for workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Workflow Id" + }, + "description": "Filter for workflow" + }, + { + "name": "start_after", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "integer", "maximum": 4294967295, "minimum": 1 }, + { "type": "null" } + ], + "description": "Filter for workflow executions that started after this UNIX timestamp", + "examples": [1640991600], + "title": "Start After" + }, + "description": "Filter for workflow executions that started after this UNIX timestamp" + }, + { + "name": "start_before", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "integer", "maximum": 4294967295, "minimum": 1 }, + { "type": "null" } + ], + "description": "Filter for workflow executions that started before this UNIX timestamp", + "examples": [1640991600], + "title": "Start Before" + }, + "description": "Filter for workflow executions that started before this UNIX timestamp" + }, + { + "name": "id_after", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "description": "Id of the item to start the query from. DO NOT SET MANUALLY.", + "title": "Id After" + }, + "description": "Id of the item to start the query from. DO NOT SET MANUALLY." + }, + { + "name": "per_page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 5, + "description": "Number of items to list per page", + "default": 20, + "title": "Per Page" + }, + "description": "Number of items to list per page" + }, + { + "name": "sort", + "in": "query", + "required": false, + "schema": { + "enum": ["asc", "desc"], + "type": "string", + "description": "Sort order of items with creation time", + "default": "desc", + "title": "Sort" + }, + "description": "Sort order of items with creation time" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkflowExecutionOut" + }, + "title": "Response Workflow Execution-List Workflow Executions" + } + } + }, + "headers": { + "link": { + "description": "Link for the next pagination page if there is any", + "schema": { + "type": "string", + "example": "<https://dev.clowm.de/api/ui/workflow_executions?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\"" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflow_executions/arbitrary": { + "post": { + "tags": ["Workflow Execution"], + "summary": "Start a workflow execution with arbitrary git repository", + "description": "Start a new workflow execution from an arbitrary git repository.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.", + "operationId": "Workflow Execution-start_arbitrary_workflow", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevWorkflowExecutionIn", + "description": "Meta-data and parameters for the workflow to start" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowExecutionOut" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "Session Token": [] }] + } + }, + "/ui/workflow_executions/{eid}": { + "get": { + "tags": ["Workflow Execution"], + "summary": "Get a workflow execution", + "description": "Get a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.", + "operationId": "Workflow Execution-get_workflow_execution", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "eid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow execution.", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Eid" + }, + "description": "ID of a workflow execution." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowExecutionOut" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "delete": { + "tags": ["Workflow Execution"], + "summary": "Delete a workflow execution", + "description": "Delete a specific workflow execution.\n\nPermission `workflow_execution:delete` required if the current user started the workflow execution,\notherwise `workflow_execution:delete_any` required.", + "operationId": "Workflow Execution-delete_workflow_execution", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "eid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow execution.", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Eid" + }, + "description": "ID of a workflow execution." + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflow_executions/{eid}/params": { + "get": { + "tags": ["Workflow Execution"], + "summary": "Get the parameters of a workflow execution", + "description": "Get the parameters of a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.", + "operationId": "Workflow Execution-get_workflow_execution_params", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "eid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow execution.", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Eid" + }, + "description": "ID of a workflow execution." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "object", + "title": "Response Workflow Execution-Get Workflow Execution Params" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflow_executions/{eid}/cancel": { + "post": { + "tags": ["Workflow Execution"], + "summary": "Cancel a workflow execution", + "description": "Cancel a running workflow execution.\n\nPermission `workflow_execution:cancel` required if the current user started the workflow execution,\notherwise `workflow_execution:cancel_any` required.", + "operationId": "Workflow Execution-cancel_workflow_execution", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "eid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow execution.", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Eid" + }, + "description": "ID of a workflow execution." + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflows/{wid}/credentials": { + "get": { + "tags": ["Workflow Credentials"], + "summary": "Get the credentials of a workflow", + "description": "Get the credentials for the repository of a workflow. Only the developer of a workflow can do this.\n\nPermission `workflow:update` required.", + "operationId": "Workflow Credentials-get_workflow_credentials", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowCredentialsOut" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "put": { + "tags": ["Workflow Credentials"], + "summary": "Update the credentials of a workflow", + "description": "Update the credentials for the repository of a workflow.\n\nPermission `workflow:update` required.", + "operationId": "Workflow Credentials-update_workflow_credentials", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowCredentialsIn", + "description": "Updated credentials for the workflow git repository" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "delete": { + "tags": ["Workflow Credentials"], + "summary": "Delete the credentials of a workflow", + "description": "Delete the credentials for the repository of a workflow.\n\nPermission `workflow:delete` required if the developer of the workflow is the same as the current user,\nother `workflow:delete_any`.", + "operationId": "Workflow Credentials-delete_workflow_credentials", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "wid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow", + "examples": ["0cc78936-381b-4bdd-999d-736c40591078"], + "title": "Wid" + }, + "description": "ID of a workflow" + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/workflow_modes/{mode_id}": { + "get": { + "tags": ["Workflow Mode"], + "summary": "Get workflow mode", + "description": "Get a workflow mode.\n\nPermission `workflow:read` required", + "operationId": "Workflow Mode-get_workflow_mode", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "mode_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a workflow mode", + "examples": ["8d47e878-f25f-41aa-b4a0-95d426b46f45"], + "title": "Mode Id" + }, + "description": "ID of a workflow mode" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/WorkflowModeOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/resources": { + "post": { + "tags": ["Resource"], + "summary": "Request a new resource", + "description": "Request a new resources.\n\nPermission `resource:create` required.", + "operationId": "Resource-create_resource", + "security": [{ "Session Token": [] }], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResourceIn", + "description": "Meta-data for the resource to request" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ResourceOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "get": { + "tags": ["Resource"], + "summary": "List resources", + "description": "List all resources.\n\nPermission `resource:list` required.", + "operationId": "Resource-list_resources", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "maintainer_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "description": "Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`.", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Maintainer Id" + }, + "description": "Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`." + }, + { + "name": "version_status", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceVersionStatus" + } + }, + { "type": "null" } + ], + "description": "Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required.", + "title": "Version Status" + }, + "description": "Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required." + }, + { + "name": "name_substring", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "maxLength": 32 }, + { "type": "null" } + ], + "description": "Filter resources by a substring in their name.", + "examples": ["gtdb"], + "title": "Name Substring" + }, + "description": "Filter resources by a substring in their name." + }, + { + "name": "public", + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "description": "Filter resources to by the public flag", + "title": "Public" + }, + "description": "Filter resources to by the public flag" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/ResourceOut" }, + "title": "Response Resource-List Resources" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/resources/sync_requests": { + "get": { + "tags": ["Resource"], + "summary": "List resource sync requests", + "description": "List all resource sync requests.\n\nPermission `resource:update_any` required.", + "operationId": "Resource-list_sync_requests", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/UserSynchronizationRequestOut" + }, + "type": "array", + "title": "Response Resource-List Sync Requests" + } + } + } + } + }, + "security": [{ "Session Token": [] }] + } + }, + "/ui/resources/ownership_transfer_request": { + "get": { + "tags": ["Resource"], + "summary": "List resource OTRs", + "description": "Get the ownership transfer requests for resources.\n\nPermission `resource:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `resource:list_all`", + "operationId": "Resource-list_resource_otrs", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "current_owner_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "description": "UID of user who is the current owner.", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "Current Owner Id" + }, + "description": "UID of user who is the current owner." + }, + { + "name": "new_owner_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "description": "UID of user who will be the new owner.", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"], + "title": "New Owner Id" + }, + "description": "UID of user who will be the new owner." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OwnershipTransferRequestOut" + }, + "title": "Response Resource-List Resource Otrs" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/resources/{rid}": { + "get": { + "tags": ["Resource"], + "summary": "Get a resource", + "description": "Get a specific resource.\n\nPermission `resource:read` required.", + "operationId": "Resource-get_resource", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "rid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"], + "title": "Rid" + }, + "description": "ID of a resource" + }, + { + "name": "version_status", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceVersionStatus" + } + }, + { "type": "null" } + ], + "description": "Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.", + "title": "Version Status" + }, + "description": "Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ResourceOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "delete": { + "tags": ["Resource"], + "summary": "Delete a resource", + "description": "Delete a resources.\n\nPermission `resource:delete` required.", + "operationId": "Resource-delete_resource", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "rid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"], + "title": "Rid" + }, + "description": "ID of a resource" + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/resources/{rid}/ownership_transfer_request": { + "get": { + "tags": ["Resource"], + "summary": "Get a resource OTR", + "description": "Get a specific resource ownership transfer request.\n\nPermission `resource:read` required if the current user is the current or new owner of the resource,\notherwise `resource:read_any` required.", + "operationId": "Resource-get_resource_otr", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "rid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"], + "title": "Rid" + }, + "description": "ID of a resource" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OwnershipTransferRequestOut" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "post": { + "tags": ["Resource"], + "summary": "Create a resource OTR", + "description": "Create a ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the current owner of the resource,\notherwise `resource:update_any` required.", + "operationId": "Resource-create_resource_otr", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "rid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"], + "title": "Rid" + }, + "description": "ID of a resource" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OwnershipTransferRequestIn", + "description": "Meta-data for the resource OTR to create" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OwnershipTransferRequestOut" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "patch": { + "tags": ["Resource"], + "summary": "Accept a resource OTR", + "description": "Accept an ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the new owner of the resource,\notherwise `resource:update_any` required.", + "operationId": "Resource-accept_resource_otr", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "rid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"], + "title": "Rid" + }, + "description": "ID of a resource" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ResourceOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "delete": { + "tags": ["Resource"], + "summary": "Delete a resource OTR", + "description": "Delete/Reject a resource ownership transfer request.\n\nPermission `resource:update` required if the current user is the current or new owner of the resource,\notherwise `resource:update_any` required.", + "operationId": "Resource-delete_resource_otr", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "rid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"], + "title": "Rid" + }, + "description": "ID of a resource" + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/resources/{rid}/versions": { + "get": { + "tags": ["ResourceVersion"], + "summary": "List versions of a resource", + "description": "List all the resource version for a specific resource.\n\nPermission 'resource:read' required.", + "operationId": "ResourceVersion-list_resource_versions", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "rid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"], + "title": "Rid" + }, + "description": "ID of a resource" + }, + { + "name": "version_status", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceVersionStatus" + } + }, + { "type": "null" } + ], + "description": "Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.", + "title": "Version Status" + }, + "description": "Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceVersionOut" + }, + "title": "Response Resourceversion-List Resource Versions" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "post": { + "tags": ["ResourceVersion"], + "summary": "Request new version of a resource", + "description": "Request a new resource version.\n\nPermission `resource:update` required if the current user is the maintainer, `resource:update_any` otherwise.", + "operationId": "ResourceVersion-request_resource_version", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "rid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"], + "title": "Rid" + }, + "description": "ID of a resource" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResourceVersionIn", + "description": "Meta-data for the resource version to request" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ResourceVersionOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/resources/{rid}/versions/{rvid}": { + "get": { + "tags": ["ResourceVersion"], + "summary": "Get version of a resource", + "description": "Get a specific resource version for a specific resource.\n\nPermission `resource:read` required. If the status of the resource version is not `LATEST` or `SYNCHRONIZED` and\nthe current user is not the maintainer, then the permission `resource:read_any` is required.", + "operationId": "ResourceVersion-get_resource_version", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "rid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"], + "title": "Rid" + }, + "description": "ID of a resource" + }, + { + "name": "rvid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource version", + "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"], + "title": "Rvid" + }, + "description": "ID of a resource version" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ResourceVersionOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/resources/{rid}/versions/{rvid}/tree": { + "get": { + "tags": ["ResourceVersion"], + "summary": "Download folder structure of resource", + "description": "Get the folder structure of the resources. Only available if the resource was previously downloaded to the cluster.\n\nPermission `resource:read` required.", + "operationId": "ResourceVersion-resource_file_tree", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "rvid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource version", + "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"], + "title": "Rvid" + }, + "description": "ID of a resource version" + }, + { + "name": "rid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"], + "title": "Rid" + }, + "description": "ID of a resource" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/FileTree" }, + "title": "Response Resourceversion-Resource File Tree" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/resources/{rid}/versions/{rvid}/request_review": { + "put": { + "tags": ["ResourceVersion"], + "summary": "Request resource version review", + "description": "Request the review of a resource version.\n\nPermission `resource:update` required.", + "operationId": "ResourceVersion-request_resource_version_review", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "rid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"], + "title": "Rid" + }, + "description": "ID of a resource" + }, + { + "name": "rvid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource version", + "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"], + "title": "Rvid" + }, + "description": "ID of a resource version" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ResourceVersionOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/resources/{rid}/versions/{rvid}/request_sync": { + "put": { + "tags": ["ResourceVersion"], + "summary": "Request resource version synchronization", + "description": "Request the synchronization of a resource version to the cluster.\n\nPermission `resource:request_sync` required.", + "operationId": "ResourceVersion-request_resource_version_sync", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "rid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"], + "title": "Rid" + }, + "description": "ID of a resource" + }, + { + "name": "rvid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource version", + "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"], + "title": "Rvid" + }, + "description": "ID of a resource version" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserSynchronizationRequestIn", + "description": "Meta-data for the synchronization request" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ResourceVersionOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/resources/{rid}/versions/{rvid}/review": { + "put": { + "tags": ["ResourceVersion"], + "summary": "Review resource version", + "description": "Review answer the resource version.\n\nPermission `resource:update_status` required.", + "operationId": "ResourceVersion-resource_version_review", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "rid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"], + "title": "Rid" + }, + "description": "ID of a resource" + }, + { + "name": "rvid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource version", + "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"], + "title": "Rvid" + }, + "description": "ID of a resource version" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRequestAnswer", + "description": "Answer for the resource version review" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ResourceVersionOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/resources/{rid}/versions/{rvid}/sync": { + "put": { + "tags": ["ResourceVersion"], + "summary": "Synchronize resource version with cluster", + "description": "Synchronize the resource version to the cluster.\n\nPermission `resource:update_any` required.", + "operationId": "ResourceVersion-resource_version_sync", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "rid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"], + "title": "Rid" + }, + "description": "ID of a resource" + }, + { + "name": "rvid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource version", + "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"], + "title": "Rvid" + }, + "description": "ID of a resource version" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRequestAnswer", + "description": "Answer to the resource version synchronization request" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ResourceVersionOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/resources/{rid}/versions/{rvid}/latest": { + "put": { + "tags": ["ResourceVersion"], + "summary": "Set resource version to latest", + "description": "Set the resource version as the latest version.\n\nPermission `resource:update_any` required.", + "operationId": "ResourceVersion-resource_version_latest", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "rid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"], + "title": "Rid" + }, + "description": "ID of a resource" + }, + { + "name": "rvid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource version", + "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"], + "title": "Rvid" + }, + "description": "ID of a resource version" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ResourceVersionOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/resources/{rid}/versions/{rvid}/cluster": { + "delete": { + "tags": ["ResourceVersion"], + "summary": "Delete resource version on cluster", + "description": "Delete the resource version on the cluster.\n\nPermission `resource:delete_any` required.", + "operationId": "ResourceVersion-delete_resource_version_cluster", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "rid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"], + "title": "Rid" + }, + "description": "ID of a resource" + }, + { + "name": "rvid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource version", + "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"], + "title": "Rvid" + }, + "description": "ID of a resource version" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ResourceVersionOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/resources/{rid}/versions/{rvid}/s3": { + "delete": { + "tags": ["ResourceVersion"], + "summary": "Delete resource version in S3", + "description": "Delete the resource version in the S3 bucket.\n\nPermission `resource:delete_any` required.", + "operationId": "ResourceVersion-delete_resource_version_s3", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "rid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"], + "title": "Rid" + }, + "description": "ID of a resource" + }, + { + "name": "rvid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a resource version", + "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"], + "title": "Rvid" + }, + "description": "ID of a resource version" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ResourceVersionOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/news": { + "post": { + "tags": ["News"], + "summary": "Create news", + "description": "Create a news event.\n\nPermission `news:create` required.", + "operationId": "News-create_news", + "security": [{ "Session Token": [] }], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NewsIn", + "description": "Meta-data for news event to create" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/NewsOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "get": { + "tags": ["News"], + "summary": "List news", + "description": "List all news events with filters.\n\nThis endpoint enforces keyset pagination. To iterate over all news, follow the link provided in the `Link` header.\nA missing `Link` header indicates that you iterated over all news with the current filters.\n\nPermission `news:list` required.", + "operationId": "News-list_news", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "created_after", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "integer", "maximum": 4294967296, "minimum": 0 }, + { "type": "null" } + ], + "description": "Filter for news that are created after this UNIX timestamp", + "title": "Created After" + }, + "description": "Filter for news that are created after this UNIX timestamp" + }, + { + "name": "creator_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "description": "Filter for news created by a specific user", + "title": "Creator Id" + }, + "description": "Filter for news created by a specific user" + }, + { + "name": "id_after", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "description": "Id of the item to start the query from. DO NOT SET MANUALLY.", + "title": "Id After" + }, + "description": "Id of the item to start the query from. DO NOT SET MANUALLY." + }, + { + "name": "per_page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 5, + "description": "Number of items to list per page", + "default": 20, + "title": "Per Page" + }, + "description": "Number of items to list per page" + }, + { + "name": "sort", + "in": "query", + "required": false, + "schema": { + "enum": ["asc", "desc"], + "type": "string", + "description": "Sort order of items with creation time", + "default": "desc", + "title": "Sort" + }, + "description": "Sort order of items with creation time" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/NewsOut" }, + "title": "Response News-List News" + } + } + }, + "headers": { + "link": { + "description": "Link for the next pagination page if there is any", + "schema": { + "type": "string", + "example": "<https://dev.clowm.de/api/news?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\"" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/news/latest": { + "get": { + "tags": ["News"], + "summary": "Get latest news", + "description": "List the current news events.\n\nPermission `news:list` required.", + "operationId": "News-list_latest_news", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { "$ref": "#/components/schemas/NewsOut" }, + "type": "array", + "title": "Response News-List Latest News" + } + } + } + } + }, + "security": [{ "Session Token": [] }] + } + }, + "/ui/news/{nid}": { + "get": { + "tags": ["News"], + "summary": "Get a specific news", + "description": "Get a specified news event.\n\nPermission `news:read` required.", + "operationId": "News-get_news", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "nid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a news event", + "examples": ["f3e2acf0-e942-44b2-8f85-52b7deb660ec"], + "title": "Nid" + }, + "description": "ID of a news event" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/NewsOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "delete": { + "tags": ["News"], + "summary": "Delete a specific news", + "description": "Delete a specified news event.\n\nPermission `news:delete` required.", + "operationId": "News-delete_news", + "security": [{ "Session Token": [] }], + "parameters": [ + { + "name": "nid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "description": "ID of a news event", + "examples": ["f3e2acf0-e942-44b2-8f85-52b7deb660ec"], + "title": "Nid" + }, + "description": "ID of a news event" + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/ui/public/workflows": { + "get": { + "tags": ["Public"], + "summary": "Get available workflows", + "description": "Public route to fetch all available workflows.", + "operationId": "Public-get_public_workflows", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { "$ref": "#/components/schemas/PublicWorkflowOut" }, + "type": "array", + "title": "Response Public-Get Public Workflows" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "AnonymizedWorkflowExecution": { + "properties": { + "workflow_execution_id": { + "type": "string", + "title": "Workflow Execution Id", + "description": "ID of the workflow execution", + "examples": ["591b6a6e-a1f0-420d-8a20-a7a60704f695"] + }, + "pseudo_uid": { + "type": "string", + "title": "Pseudo Uid", + "description": "Anonymized user ID of the user who ran the workflow execution", + "examples": [ + "7ed4249857b656e96f456449796e461e6001d3fb2481a44701f70ca437bd53a2" + ] + }, + "workflow_mode_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Workflow Mode Id", + "description": "ID of the workflow mode this workflow execution ran in", + "examples": ["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"] + }, + "workflow_version_id": { + "type": "string", + "title": "Workflow Version Id", + "description": "Hash of the git commit", + "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"] + }, + "started_at": { + "type": "string", + "format": "date", + "title": "Started At", + "description": "Day of the workflow execution", + "examples": ["2023-01-01"] + }, + "workflow_id": { + "type": "string", + "title": "Workflow Id", + "description": "ID of the workflow", + "examples": ["20128c04-e834-40a8-9878-68939ae46423"] + }, + "developer_id": { + "type": "string", + "title": "Developer Id", + "description": "ID of developer of the workflow", + "examples": ["28c5353b8bb34984a8bd4169ba94c606"] + }, + "status": { + "$ref": "#/components/schemas/WorkflowExecutionStatus", + "description": "End status of the workflow execution", + "examples": ["SUCCESS"] + } + }, + "type": "object", + "required": [ + "workflow_execution_id", + "pseudo_uid", + "workflow_version_id", + "started_at", + "workflow_id", + "developer_id", + "status" + ], + "title": "AnonymizedWorkflowExecution" + }, + "ApiTokenIn": { + "properties": { + "name": { + "type": "string", + "maxLength": 63, + "minLength": 3, + "pattern": "^[a-z\\d-]+$", + "title": "Name", + "description": "Short name for the API token", + "examples": ["api-token-42"] + }, + "expires_at": { + "anyOf": [ + { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 }, + { "type": "null" } + ], + "title": "Expires At", + "description": "Unix timestamp when the token should expire", + "examples": [1719784800] + }, + "scopes": { + "items": { "type": "string", "enum": ["read", "write"] }, + "type": "array", + "minItems": 1, + "title": "Scopes", + "description": "List of scopes this Api token has" + } + }, + "type": "object", + "required": ["name", "scopes"], + "title": "ApiTokenIn" + }, + "ApiTokenOut": { + "properties": { + "name": { + "type": "string", + "maxLength": 63, + "minLength": 3, + "pattern": "^[a-z\\d-]+$", + "title": "Name", + "description": "Short name for the API token", + "examples": ["api-token-42"] + }, + "expires_at": { + "anyOf": [ + { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 }, + { "type": "null" } + ], + "title": "Expires At", + "description": "Unix timestamp when the token should expire", + "examples": [1719784800] + }, + "scopes": { + "items": { "type": "string", "enum": ["read", "write"] }, + "type": "array", + "minItems": 1, + "title": "Scopes", + "description": "List of scopes this Api token has" + }, + "token_id": { + "type": "string", + "title": "Token Id", + "description": "The ID of the token", + "examples": ["b4c861a7-7f52-4332-a001-78e0500dabbc"] + }, + "uid": { + "type": "string", + "title": "Uid", + "description": "The ID of the owner", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"] + }, + "created_at": { + "type": "integer", + "title": "Created At", + "description": "The UNIX timestamp when this token was created", + "examples": ["1717192800"] + }, + "last_used": { + "anyOf": [{ "type": "integer" }, { "type": "null" }], + "title": "Last Used", + "description": "The UNIX timestamp when this token was used the last time", + "examples": ["1717193800"] + } + }, + "type": "object", + "required": ["name", "scopes", "token_id", "uid", "created_at"], + "title": "ApiTokenOut" + }, + "ApiTokenPrivateOut": { + "properties": { + "name": { + "type": "string", + "maxLength": 63, + "minLength": 3, + "pattern": "^[a-z\\d-]+$", + "title": "Name", + "description": "Short name for the API token", + "examples": ["api-token-42"] + }, + "expires_at": { + "anyOf": [ + { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 }, + { "type": "null" } + ], + "title": "Expires At", + "description": "Unix timestamp when the token should expire", + "examples": [1719784800] + }, + "scopes": { + "items": { "type": "string", "enum": ["read", "write"] }, + "type": "array", + "minItems": 1, + "title": "Scopes", + "description": "List of scopes this Api token has" + }, + "token_id": { + "type": "string", + "title": "Token Id", + "description": "The ID of the token", + "examples": ["b4c861a7-7f52-4332-a001-78e0500dabbc"] + }, + "uid": { + "type": "string", + "title": "Uid", + "description": "The ID of the owner", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"] + }, + "created_at": { + "type": "integer", + "title": "Created At", + "description": "The UNIX timestamp when this token was created", + "examples": ["1717192800"] + }, + "last_used": { + "anyOf": [{ "type": "integer" }, { "type": "null" }], + "title": "Last Used", + "description": "The UNIX timestamp when this token was used the last time", + "examples": ["1717193800"] + }, + "token": { + "type": "string", + "title": "Token", + "description": "The actual token used for authentication", + "examples": ["J21NRKUYgyVUgvJ3cIdllS-MMa9ny1UDKFF18aetDvo"] + } + }, + "type": "object", + "required": [ + "name", + "scopes", + "token_id", + "uid", + "created_at", + "token" + ], + "title": "ApiTokenPrivateOut" + }, + "Body_Bucket-update_bucket_public_state": { + "properties": { + "public": { + "type": "boolean", + "title": "Public", + "description": "New public state" + } + }, + "type": "object", + "required": ["public"], + "title": "Body_Bucket-update_bucket_public_state" + }, + "Body_Workflow_Version-upload_workflow_version_icon": { + "properties": { + "icon": { + "type": "string", + "format": "binary", + "title": "Icon", + "description": "Icon for the Workflow." + } + }, + "type": "object", + "required": ["icon"], + "title": "Body_Workflow Version-upload_workflow_version_icon" + }, + "BucketIn": { + "properties": { + "name": { + "type": "string", + "maxLength": 63, + "minLength": 3, + "pattern": "^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$", + "title": "Name", + "description": "Name of the bucket", + "examples": ["test-bucket"] + }, + "description": { + "type": "string", + "maxLength": 65536, + "minLength": 16, + "title": "Description", + "description": "Description of the bucket", + "examples": ["This is a sample description of a bucket"] + } + }, + "type": "object", + "required": ["name", "description"], + "title": "BucketIn", + "description": "Schema for creating a new bucket." + }, + "BucketOut": { + "properties": { + "size_limit": { + "anyOf": [ + { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 }, + { "type": "null" } + ], + "title": "Size Limit", + "description": "Size limit of the bucket in KiB", + "examples": [10240] + }, + "object_limit": { + "anyOf": [ + { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 }, + { "type": "null" } + ], + "title": "Object Limit", + "description": "Number of objects limit of the bucket", + "examples": [10000] + }, + "name": { + "type": "string", + "maxLength": 63, + "minLength": 3, + "pattern": "^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$", + "title": "Name", + "description": "Name of the bucket", + "examples": ["test-bucket"] + }, + "description": { + "type": "string", + "maxLength": 65536, + "minLength": 16, + "title": "Description", + "description": "Description of the bucket", + "examples": ["This is a sample description of a bucket"] + }, + "created_at": { + "type": "integer", + "maximum": 4294967295.0, + "minimum": 1.0, + "title": "Created At", + "description": "UNIX timestamp when the bucket was created", + "examples": [1640991600] + }, + "owner_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Owner Id", + "description": "UID of the owner", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"] + }, + "public": { + "type": "boolean", + "title": "Public", + "description": "Flag if the bucket is anonymously readable" + } + }, + "type": "object", + "required": ["name", "description", "created_at", "owner_id", "public"], + "title": "BucketOut", + "description": "Schema for answering a request with a bucket." + }, + "BucketPermissionIn": { + "properties": { + "from_timestamp": { + "anyOf": [ + { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 }, + { "type": "null" } + ], + "title": "From Timestamp", + "description": "Start date of permission as UNIX timestamp", + "examples": [1640991600] + }, + "to_timestamp": { + "anyOf": [ + { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 }, + { "type": "null" } + ], + "title": "To Timestamp", + "description": "End date of permission as UNIX timestamp", + "examples": [1640991600] + }, + "file_prefix": { + "anyOf": [ + { "type": "string", "maxLength": 512, "minLength": 1 }, + { "type": "null" } + ], + "title": "File Prefix", + "description": "Prefix of subfolder", + "examples": ["pseudo/sub/folder/"] + }, + "scopes": { + "items": { "type": "string", "enum": ["read", "write"] }, + "type": "array", + "minItems": 1, + "title": "Scopes", + "description": "Scopes of the bucket permission" + }, + "uid": { + "type": "string", + "format": "uuid", + "title": "Uid", + "description": "UID of the grantee", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"] + }, + "bucket_name": { + "type": "string", + "maxLength": 63, + "minLength": 3, + "title": "Bucket Name", + "description": "Name of Bucket", + "examples": ["test-bucket"] + } + }, + "type": "object", + "required": ["scopes", "uid", "bucket_name"], + "title": "BucketPermissionIn" + }, + "BucketPermissionOut": { + "properties": { + "from_timestamp": { + "anyOf": [ + { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 }, + { "type": "null" } + ], + "title": "From Timestamp", + "description": "Start date of permission as UNIX timestamp", + "examples": [1640991600] + }, + "to_timestamp": { + "anyOf": [ + { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 }, + { "type": "null" } + ], + "title": "To Timestamp", + "description": "End date of permission as UNIX timestamp", + "examples": [1640991600] + }, + "file_prefix": { + "anyOf": [ + { "type": "string", "maxLength": 512, "minLength": 1 }, + { "type": "null" } + ], + "title": "File Prefix", + "description": "Prefix of subfolder", + "examples": ["pseudo/sub/folder/"] + }, + "scopes": { + "items": { "type": "string", "enum": ["read", "write"] }, + "type": "array", + "minItems": 1, + "title": "Scopes", + "description": "Scopes of the bucket permission" + }, + "uid": { + "type": "string", + "title": "Uid", + "description": "UID of the grantee", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"] + }, + "bucket_name": { + "type": "string", + "maxLength": 63, + "minLength": 3, + "title": "Bucket Name", + "description": "Name of Bucket", + "examples": ["test-bucket"] + } + }, + "type": "object", + "required": ["scopes", "uid", "bucket_name"], + "title": "BucketPermissionOut", + "description": "Schema for the bucket permissions." + }, + "BucketPermissionParameters": { + "properties": { + "from_timestamp": { + "anyOf": [ + { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 }, + { "type": "null" } + ], + "title": "From Timestamp", + "description": "Start date of permission as UNIX timestamp", + "examples": [1640991600] + }, + "to_timestamp": { + "anyOf": [ + { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 }, + { "type": "null" } + ], + "title": "To Timestamp", + "description": "End date of permission as UNIX timestamp", + "examples": [1640991600] + }, + "file_prefix": { + "anyOf": [ + { "type": "string", "maxLength": 512, "minLength": 1 }, + { "type": "null" } + ], + "title": "File Prefix", + "description": "Prefix of subfolder", + "examples": ["pseudo/sub/folder/"] + }, + "scopes": { + "items": { "type": "string", "enum": ["read", "write"] }, + "type": "array", + "minItems": 1, + "title": "Scopes", + "description": "Scopes of the bucket permission" + } + }, + "type": "object", + "required": ["scopes"], + "title": "BucketPermissionParameters", + "description": "Schema for the parameters of a bucket permission." + }, + "BucketSizeLimits": { + "properties": { + "size_limit": { + "anyOf": [ + { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 }, + { "type": "null" } + ], + "title": "Size Limit", + "description": "Size limit of the bucket in KiB", + "examples": [10240] + }, + "object_limit": { + "anyOf": [ + { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 }, + { "type": "null" } + ], + "title": "Object Limit", + "description": "Number of objects limit of the bucket", + "examples": [10000] + } + }, + "type": "object", + "title": "BucketSizeLimits", + "description": "Schema to represent bucket limits." + }, + "BucketType": { + "type": "string", + "enum": ["OWN", "ALL", "PERMISSION"], + "title": "BucketType", + "description": "Enumeration for the type of buckets to fetch from the DB\n\nOWN: Only fetch buckets that the user owns\nPERMISSION: Only fetch foreign buckets that the user has access to\nALL: Fetch all buckets that the user has access to" + }, + "DevWorkflowExecutionIn": { + "properties": { + "parameters": { + "type": "object", + "title": "Parameters", + "description": "Parameters for this workflow" + }, + "logs_s3_path": { + "anyOf": [ + { + "type": "string", + "maxLength": 1024, + "minLength": 3, + "pattern": "^s3://(\\w){1}(\\w-\\./)*(\\w){1}" + }, + { "type": "null" } + ], + "title": "Logs S3 Path", + "description": "S3 Path where to save logs and reports. If None, nothing will be uploaded.", + "examples": ["s3://example-bucket/logs"] + }, + "provenance_s3_path": { + "anyOf": [ + { + "type": "string", + "maxLength": 1024, + "minLength": 3, + "pattern": "^s3://(\\w){1}(\\w-\\./)*(\\w){1}" + }, + { "type": "null" } + ], + "title": "Provenance S3 Path", + "description": "S3 Path where to save provenance information. If None, nothing will be uploaded.", + "examples": ["s3://example-bucket/provenance"] + }, + "debug_s3_path": { + "anyOf": [ + { + "type": "string", + "maxLength": 1024, + "minLength": 3, + "pattern": "^s3://(\\w){1}(\\w-\\./)*(\\w){1}" + }, + { "type": "null" } + ], + "title": "Debug S3 Path", + "description": "S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.", + "examples": ["s3://example-bucket/debug"] + }, + "git_commit_hash": { + "type": "string", + "maxLength": 40, + "minLength": 40, + "pattern": "^[0-9a-f]{40}$", + "title": "Git Commit Hash", + "description": "Hash of the git commit", + "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"] + }, + "repository_url": { + "type": "string", + "minLength": 1, + "format": "uri", + "title": "Repository Url", + "description": "URL to the Git repository belonging to this workflow", + "examples": ["https://github.com/example-user/example"] + }, + "token": { + "anyOf": [ + { "type": "string", "maxLength": 128 }, + { "type": "null" } + ], + "title": "Token", + "description": "Token to access the content git repository", + "examples": ["vnpau89avpa48iunga984gh9h89pvhj"] + }, + "mode": { + "anyOf": [ + { "$ref": "#/components/schemas/WorkflowModeIn" }, + { "type": "null" } + ], + "description": "Mode of the workflow with an alternative entrypoint" + }, + "nextflow_version": { + "$ref": "#/components/schemas/NextflowVersion", + "description": "The version of Nextflow this workflow execution requires" + } + }, + "type": "object", + "required": [ + "parameters", + "git_commit_hash", + "repository_url", + "nextflow_version" + ], + "title": "DevWorkflowExecutionIn" + }, + "DocumentationEnum": { + "type": "string", + "enum": [ + "usage.md", + "input.md", + "output.md", + "changelog.md", + "parameter_schema.json", + "clowm_info.json", + "CITATIONS.md" + ], + "title": "DocumentationEnum" + }, + "FileTree": { + "properties": { + "type": { + "type": "string", + "enum": ["file", "directory", "link"], + "title": "Type" + }, + "name": { "type": "string", "title": "Name" }, + "target": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Target" + }, + "contents": { + "anyOf": [ + { + "items": { "$ref": "#/components/schemas/FileTree" }, + "type": "array" + }, + { "type": "null" } + ], + "title": "Contents" + }, + "size": { "type": "integer", "title": "Size" } + }, + "type": "object", + "required": ["type", "name", "size"], + "title": "FileTree" + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { "$ref": "#/components/schemas/ValidationError" }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "IconUpdateOut": { + "properties": { + "icon_url": { + "type": "string", + "minLength": 1, + "format": "uri", + "title": "Icon Url", + "description": "URL to the uploaded icon", + "examples": [ + "https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png" + ] + } + }, + "type": "object", + "required": ["icon_url"], + "title": "IconUpdateOut" + }, + "InstanceSpecificDefaultParameters": { + "additionalProperties": { + "anyOf": [ + { "type": "string" }, + { "type": "integer" }, + { "type": "number" }, + { "type": "boolean" } + ] + }, + "type": "object" + }, + "NewsIn": { + "properties": { + "content": { + "type": "string", + "maxLength": 65536, + "minLength": 16, + "title": "Content", + "description": "Content of the news. Can contain Markdown.", + "examples": ["## Header\n\nSome text"] + }, + "title": { + "type": "string", + "maxLength": 256, + "minLength": 3, + "title": "Title", + "description": "Title of the news", + "examples": ["Some title"] + }, + "important_till": { + "anyOf": [ + { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 }, + { "type": "null" } + ], + "title": "Important Till", + "description": "UNIX timestamp till the news is important.", + "examples": [1640991600] + }, + "category": { + "type": "string", + "enum": ["workflow", "resource", "system"], + "title": "Category", + "description": "Category of the news event", + "default": "system" + } + }, + "type": "object", + "required": ["content", "title"], + "title": "NewsIn" + }, + "NewsOut": { + "properties": { + "content": { + "type": "string", + "maxLength": 65536, + "minLength": 16, + "title": "Content", + "description": "Content of the news. Can contain Markdown.", + "examples": ["## Header\n\nSome text"] + }, + "title": { + "type": "string", + "maxLength": 256, + "minLength": 3, + "title": "Title", + "description": "Title of the news", + "examples": ["Some title"] + }, + "important_till": { + "anyOf": [ + { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 }, + { "type": "null" } + ], + "title": "Important Till", + "description": "UNIX timestamp till the news is important.", + "examples": [1640991600] + }, + "category": { + "type": "string", + "enum": ["workflow", "resource", "system"], + "title": "Category", + "description": "Category of the news event" + }, + "news_id": { + "type": "string", + "title": "News Id", + "description": "ID of the news event", + "examples": ["f3e2acf0-e942-44b2-8f85-52b7deb660ec"] + }, + "creator_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Creator Id", + "description": "ID of the creator", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"] + }, + "created_at": { + "type": "integer", + "maximum": 4294967295.0, + "minimum": 1.0, + "title": "Created At", + "description": "UNIX timestamp when the bucket was created", + "examples": [1640991600] + } + }, + "type": "object", + "required": ["content", "title", "category", "news_id", "created_at"], + "title": "NewsOut" + }, + "NextflowVersion": { + "type": "string", + "enum": [ + "22.10.0", + "22.10.1", + "22.10.2", + "22.10.3", + "22.10.4", + "22.10.5", + "22.10.6", + "22.10.7", + "22.10.8", + "23.04.0", + "23.04.1", + "23.04.2", + "23.04.3", + "23.04.4", + "23.04.5", + "23.10.0", + "23.10.1", + "23.10.2", + "23.10.3", + "23.10.4", + "24.04.1", + "24.04.2", + "24.04.3", + "24.04.4", + "24.10.0", + "24.10.1", + "24.10.2", + "24.10.3", + "24.10.4" + ], + "title": "NextflowVersion" + }, + "OIDCProvider": { + "type": "string", + "enum": ["lifescience-aai", "nfdi-aai"], + "title": "OIDCProvider" + }, + "OwnershipTransferRequestIn": { + "properties": { + "new_owner_uid": { + "type": "string", + "format": "uuid", + "title": "New Owner Uid", + "description": "The new owner that get the request", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"] + }, + "comment": { + "anyOf": [ + { "type": "string", "maxLength": 256 }, + { "type": "null" } + ], + "title": "Comment", + "description": "An optional comment for the transfer request", + "examples": ["This is an example comment"] + } + }, + "type": "object", + "required": ["new_owner_uid"], + "title": "OwnershipTransferRequestIn" + }, + "OwnershipTransferRequestOut": { + "properties": { + "new_owner_uid": { + "type": "string", + "title": "New Owner Uid", + "description": "The new owner that get the request", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"] + }, + "comment": { + "type": "string", + "title": "Comment", + "description": "An optional comment for the transfer request", + "default": "", + "examples": ["This is an example comment"] + }, + "created_at": { + "type": "integer", + "maximum": 4294967295.0, + "minimum": 1.0, + "title": "Created At", + "description": "Time when the ownership transfer was requested as UNIX timestamp", + "examples": [1640991600] + }, + "current_owner_uid": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Current Owner Uid", + "description": "The current uid of the current owner if he exists", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"] + }, + "target_id": { + "type": "string", + "title": "Target Id", + "description": "Id of the target that gets its ownership transferred" + }, + "target_name": { + "type": "string", + "title": "Target Name", + "description": "Name of the target", + "examples": [ + "example-bucket", + "Example Workflow", + "Example Resource" + ] + }, + "target_description": { + "type": "string", + "title": "Target Description", + "description": "Description of then target", + "examples": ["Some long description of a target"] + }, + "target_type": { + "$ref": "#/components/schemas/OwnershipTypeEnum", + "description": "Target type of the ownership transfer", + "examples": ["bucket"] + } + }, + "type": "object", + "required": [ + "new_owner_uid", + "created_at", + "target_id", + "target_name", + "target_description", + "target_type" + ], + "title": "OwnershipTransferRequestOut" + }, + "OwnershipTypeEnum": { + "type": "string", + "enum": ["bucket", "workflow", "resource"], + "title": "OwnershipTypeEnum" + }, + "ParameterExtension-Input": { + "properties": { + "mapping": { + "additionalProperties": { + "additionalProperties": { + "anyOf": [ + { "type": "string" }, + { "type": "integer" }, + { "type": "number" } + ] + }, + "type": "object" + }, + "type": "object", + "title": "Mapping", + "description": "The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.", + "examples": [ + { + "some-complex-parameter": { + "Option 1": "/some/path", + "Option 2": "/some/other/path" + } + } + ] + }, + "defaults": { + "$ref": "#/components/schemas/InstanceSpecificDefaultParameters", + "description": "Dictionary with parameter name as key and default value as value", + "examples": [{ "parameter1": "somevalue", "parameter2": 12 }] + }, + "parameter_visibility": { + "$ref": "#/components/schemas/ParameterVisibilityMapping" + } + }, + "type": "object", + "title": "ParameterExtension" + }, + "ParameterExtension-Output": { + "properties": { + "mapping": { + "additionalProperties": { + "additionalProperties": { + "anyOf": [ + { "type": "string" }, + { "type": "integer" }, + { "type": "number" } + ] + }, + "type": "object" + }, + "type": "object", + "title": "Mapping", + "description": "The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.", + "examples": [ + { + "some-complex-parameter": { + "Option 1": "/some/path", + "Option 2": "/some/other/path" + } + } + ] + }, + "defaults": { + "$ref": "#/components/schemas/InstanceSpecificDefaultParameters", + "description": "Dictionary with parameter name as key and default value as value", + "examples": [{ "parameter1": "somevalue", "parameter2": 12 }] + }, + "parameter_visibility": { + "$ref": "#/components/schemas/ParameterVisibilityMapping" + } + }, + "type": "object", + "title": "ParameterExtension" + }, + "ParameterVisibility": { + "type": "integer", + "enum": [10, 20, 30, 40], + "title": "ParameterVisibility" + }, + "ParameterVisibilityMapping": { + "additionalProperties": { + "$ref": "#/components/schemas/ParameterVisibility" + }, + "type": "object" + }, + "PermissionStatus": { + "type": "string", + "enum": ["ACTIVE", "INACTIVE"], + "title": "PermissionStatus", + "description": "Status of a bucket permission. Can be either `ACTIVE` or `INACTIVE`. A permission can only get `INACTIVE` if the\npermission itself has a time limit and the current time is not in the timespan." + }, + "PublicWorkflowOut": { + "properties": { + "name": { + "type": "string", + "maxLength": 64, + "minLength": 3, + "title": "Name", + "description": "Short descriptive name of the workflow", + "examples": ["RNA ReadMapper"] + }, + "short_description": { + "type": "string", + "maxLength": 256, + "minLength": 64, + "title": "Short Description", + "description": "Short description of the workflow", + "examples": [ + "This should be a very good example of a short and descriptive description" + ] + }, + "repository_url": { + "type": "string", + "minLength": 1, + "format": "uri", + "title": "Repository Url", + "description": "URL to the Git repository belonging to this workflow", + "examples": ["https://github.com/example-user/example"] + }, + "workflow_id": { + "type": "string", + "title": "Workflow Id", + "description": "ID of the workflow", + "examples": ["20128c04-e834-40a8-9878-68939ae46423"] + }, + "latest_git_commit_hash": { + "type": "string", + "maxLength": 40, + "minLength": 40, + "pattern": "^[0-9a-f]{40}$", + "title": "Latest Git Commit Hash", + "description": "Hash of the git commit", + "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"] + }, + "latest_version_tag": { + "type": "string", + "maxLength": 10, + "minLength": 5, + "title": "Latest Version Tag", + "description": "Version of the Workflow. Should follow semantic versioning", + "examples": ["v1.1.0"] + }, + "developer": { + "type": "string", + "title": "Developer", + "description": "Name of the developer", + "default": "", + "examples": ["Bilbo Baggins"] + }, + "latest_version_timestamp": { + "type": "integer", + "maximum": 4294967295.0, + "minimum": 1.0, + "title": "Latest Version Timestamp", + "description": "Timestamp when the last version was created as UNIX timestamp", + "examples": [1640991600] + }, + "icon_url": { + "anyOf": [ + { "type": "string", "minLength": 1, "format": "uri" }, + { "type": "null" } + ], + "title": "Icon Url", + "description": "URL to the workflow icon", + "readOnly": true, + "examples": [ + "https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png" + ] + } + }, + "type": "object", + "required": [ + "name", + "short_description", + "repository_url", + "workflow_id", + "latest_git_commit_hash", + "latest_version_tag", + "latest_version_timestamp", + "icon_url" + ], + "title": "PublicWorkflowOut" + }, + "ResourceIn": { + "properties": { + "release": { + "type": "string", + "maxLength": 32, + "minLength": 3, + "title": "Release", + "description": "Short tag describing the version of the resource", + "examples": ["01-2023"] + }, + "name": { + "type": "string", + "maxLength": 32, + "minLength": 3, + "title": "Name", + "description": "Short Name for the resource", + "examples": ["blast-db"] + }, + "description": { + "type": "string", + "maxLength": 264, + "minLength": 16, + "title": "Description", + "description": "Short description for this resource", + "examples": ["This is a short description for a resource"] + }, + "source": { + "type": "string", + "maxLength": 264, + "minLength": 8, + "title": "Source", + "description": "A link or similar where the resource originates from", + "examples": ["https://example.com/db"] + }, + "private": { + "type": "boolean", + "title": "Private", + "description": "Flag if this resource should be default visible in the UI", + "default": true + } + }, + "type": "object", + "required": ["release", "name", "description", "source"], + "title": "ResourceIn" + }, + "ResourceOut": { + "properties": { + "name": { + "type": "string", + "maxLength": 32, + "minLength": 3, + "title": "Name", + "description": "Short Name for the resource", + "examples": ["blast-db"] + }, + "description": { + "type": "string", + "maxLength": 264, + "minLength": 16, + "title": "Description", + "description": "Short description for this resource", + "examples": ["This is a short description for a resource"] + }, + "source": { + "type": "string", + "maxLength": 264, + "minLength": 8, + "title": "Source", + "description": "A link or similar where the resource originates from", + "examples": ["https://example.com/db"] + }, + "private": { + "type": "boolean", + "title": "Private", + "description": "Flag if this resource should be default visible in the UI", + "default": true + }, + "resource_id": { + "type": "string", + "title": "Resource Id", + "description": "ID of the resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"] + }, + "maintainer_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Maintainer Id", + "description": "ID of the maintainer", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"] + }, + "versions": { + "items": { "$ref": "#/components/schemas/ResourceVersionOut" }, + "type": "array", + "title": "Versions", + "description": "Versions of the resource" + } + }, + "type": "object", + "required": [ + "name", + "description", + "source", + "resource_id", + "maintainer_id", + "versions" + ], + "title": "ResourceOut" + }, + "ResourceVersionIn": { + "properties": { + "release": { + "type": "string", + "maxLength": 32, + "minLength": 3, + "title": "Release", + "description": "Short tag describing the version of the resource", + "examples": ["01-2023"] + } + }, + "type": "object", + "required": ["release"], + "title": "ResourceVersionIn" + }, + "ResourceVersionOut": { + "properties": { + "release": { + "type": "string", + "maxLength": 32, + "minLength": 3, + "title": "Release", + "description": "Short tag describing the version of the resource", + "examples": ["01-2023"] + }, + "status": { + "$ref": "#/components/schemas/ResourceVersionStatus", + "description": "Status of the resource version" + }, + "resource_version_id": { + "type": "string", + "title": "Resource Version Id", + "description": "ID of the resource version", + "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"] + }, + "resource_id": { + "type": "string", + "title": "Resource Id", + "description": "ID of the resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"] + }, + "created_at": { + "type": "integer", + "maximum": 4294967295.0, + "minimum": 1.0, + "title": "Created At", + "description": "Timestamp when the version was created as UNIX timestamp", + "examples": [1672527600] + }, + "compressed_size": { + "type": "integer", + "maximum": 1.8446744073709552e19, + "minimum": 0.0, + "title": "Compressed Size", + "description": "Size of the compressed resource in bytes", + "examples": [42097156608] + }, + "cluster_path": { + "type": "string", + "title": "Cluster Path", + "description": "Path to the resource on the cluster if the resource is synchronized", + "readOnly": true, + "examples": [ + "/vol/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4", + "/vol/resources/CLDB-0e240ccd/latest" + ] + }, + "s3_path": { + "type": "string", + "title": "S3 Path", + "description": "Path to the resource in the S3 Bucket. Not publicly available.", + "readOnly": true, + "examples": [ + "s3://clowm-data/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4/resource.tar.gz" + ] + } + }, + "type": "object", + "required": [ + "release", + "status", + "resource_version_id", + "resource_id", + "created_at", + "compressed_size", + "cluster_path", + "s3_path" + ], + "title": "ResourceVersionOut" + }, + "ResourceVersionStatus": { + "type": "string", + "enum": [ + "RESOURCE_REQUESTED", + "WAIT_FOR_REVIEW", + "DENIED", + "APPROVED", + "SYNC_REQUESTED", + "SYNCHRONIZING", + "SYNC_ERROR", + "SYNCHRONIZED", + "SETTING_LATEST", + "LATEST", + "CLUSTER_DELETING", + "CLUSTER_DELETE_ERROR", + "S3_DELETING", + "S3_DELETE_ERROR", + "S3_DELETED" + ], + "title": "ResourceVersionStatus", + "description": "Enumeration for the possible status of a resource version." + }, + "RoleEnum": { + "type": "string", + "enum": [ + "administrator", + "user", + "reviewer", + "developer", + "db_maintainer" + ], + "title": "RoleEnum" + }, + "S3Key": { + "properties": { + "uid": { + "type": "string", + "title": "Uid", + "description": "UID of the user of that access key", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"] + }, + "access_key": { + "type": "string", + "title": "Access Key", + "description": "ID of the S3 access key", + "examples": ["CRJ6B037V2ZT4U3W17VC"] + }, + "secret_key": { + "type": "string", + "title": "Secret Key", + "description": "Secret of the S3 access key", + "examples": ["2F5uNTI1qvt4oAroXV0wWct8rWclL2QvFXKqSqjS"] + } + }, + "type": "object", + "required": ["uid", "access_key", "secret_key"], + "title": "S3Key", + "description": "Schema for a S3 key associated with a user." + }, + "UserIn": { + "properties": { + "display_name": { + "type": "string", + "maxLength": 256, + "title": "Display Name", + "description": "Full Name of the user", + "examples": ["Bilbo Baggins"] + }, + "roles": { + "items": { "$ref": "#/components/schemas/RoleEnum" }, + "type": "array", + "title": "Roles", + "examples": [["user"]] + }, + "email": { + "type": "string", + "format": "email", + "title": "Email", + "description": "Email of the user", + "examples": ["user@example.org"] + } + }, + "type": "object", + "required": ["display_name", "email"], + "title": "UserIn" + }, + "UserOut": { + "properties": { + "display_name": { + "type": "string", + "maxLength": 256, + "title": "Display Name", + "description": "Full Name of the user", + "examples": ["Bilbo Baggins"] + }, + "uid": { + "type": "string", + "title": "Uid", + "description": "ID of the user", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"] + } + }, + "type": "object", + "required": ["display_name", "uid"], + "title": "UserOut", + "description": "Schema for a user." + }, + "UserOutExtended": { + "properties": { + "roles": { + "items": { "$ref": "#/components/schemas/RoleEnum" }, + "type": "array", + "title": "Roles", + "description": "Roles of the user", + "examples": [["user"]] + }, + "display_name": { + "type": "string", + "maxLength": 256, + "title": "Display Name", + "description": "Full Name of the user", + "examples": ["Bilbo Baggins"] + }, + "uid": { + "type": "string", + "title": "Uid", + "description": "ID of the user", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"] + }, + "lifescience_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Lifescience Id", + "description": "Lifesicence AAI ID of the user", + "examples": ["18b59678f16d2c59306c0aedb1dc7ddcfe162456"] + }, + "nfdi_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Nfdi Id", + "description": "NFDI AAI ID of the user", + "examples": ["18b59678f16d2c59306c0aedb1dc7ddcfe162456"] + }, + "invitation_token_created_at": { + "anyOf": [{ "type": "integer" }, { "type": "null" }], + "title": "Invitation Token Created At", + "description": "Timestamp when the invitation token was created as UNIX timestamp" + }, + "email": { + "anyOf": [ + { "type": "string", "format": "email" }, + { "type": "null" } + ], + "title": "Email", + "description": "Email of the user", + "examples": ["user@example.org"] + }, + "gravatar_url": { + "type": "string", + "minLength": 1, + "format": "uri", + "title": "Gravatar Url", + "description": "URL to the gravatar avatar based on the users email", + "readOnly": true, + "examples": [ + "https://gravatar.com/avatar/87a8c45825eb709ee8e453d2c0f8154e1b9bf4b45bb9b81b7662177340aa9d38" + ] + } + }, + "type": "object", + "required": ["roles", "display_name", "uid", "gravatar_url"], + "title": "UserOutExtended" + }, + "UserRequestAnswer": { + "properties": { + "deny": { + "type": "boolean", + "title": "Deny", + "description": "Flag to indicate if the request was denied.", + "default": false + }, + "reason": { + "anyOf": [ + { "type": "string", "maxLength": 512, "minLength": 16 }, + { "type": "null" } + ], + "title": "Reason", + "description": "Reason why the request was denied or approved. Required if request is denied." + } + }, + "type": "object", + "title": "UserRequestAnswer" + }, + "UserRoles": { + "properties": { + "roles": { + "items": { "$ref": "#/components/schemas/RoleEnum" }, + "type": "array", + "title": "Roles", + "description": "Roles of the user", + "examples": [["user"]] + } + }, + "type": "object", + "required": ["roles"], + "title": "UserRoles" + }, + "UserSynchronizationRequestIn": { + "properties": { + "reason": { + "type": "string", + "maxLength": 512, + "minLength": 16, + "title": "Reason", + "description": "Reason why the request was requested.", + "examples": [ + "This version is required to reproduce a execution with Workflow XY@2.0." + ] + } + }, + "type": "object", + "required": ["reason"], + "title": "UserSynchronizationRequestIn" + }, + "UserSynchronizationRequestOut": { + "properties": { + "reason": { + "type": "string", + "maxLength": 512, + "minLength": 16, + "title": "Reason", + "description": "Reason why the request was requested.", + "examples": [ + "This version is required to reproduce a execution with Workflow XY@2.0." + ] + }, + "resource_version_id": { + "type": "string", + "title": "Resource Version Id", + "description": "ID of the resource version", + "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"] + }, + "resource_id": { + "type": "string", + "title": "Resource Id", + "description": "ID of the resource", + "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"] + }, + "requester_id": { + "type": "string", + "title": "Requester Id", + "description": "ID of the user that requested this resource synchronization", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"] + } + }, + "type": "object", + "required": [ + "reason", + "resource_version_id", + "resource_id", + "requester_id" + ], + "title": "UserSynchronizationRequestOut" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { "anyOf": [{ "type": "string" }, { "type": "integer" }] }, + "type": "array", + "title": "Location" + }, + "msg": { "type": "string", "title": "Message" }, + "type": { "type": "string", "title": "Error Type" } + }, + "type": "object", + "required": ["loc", "msg", "type"], + "title": "ValidationError" + }, + "WorkflowCredentialsIn": { + "properties": { + "token": { + "type": "string", + "maxLength": 128, + "title": "Token", + "description": "Token to access the content git repository", + "examples": ["vnpau89avpa48iunga984gh9h89pvhj"] + } + }, + "type": "object", + "required": ["token"], + "title": "WorkflowCredentialsIn" + }, + "WorkflowCredentialsOut": { + "properties": { + "token": { + "anyOf": [ + { "type": "string", "maxLength": 128 }, + { "type": "null" } + ], + "title": "Token", + "description": "Token to access the content git repository", + "examples": ["vnpau89avpa48iunga984gh9h89pvhj"] + } + }, + "type": "object", + "title": "WorkflowCredentialsOut" + }, + "WorkflowExecutionIn": { + "properties": { + "parameters": { + "type": "object", + "title": "Parameters", + "description": "Parameters for this workflow" + }, + "logs_s3_path": { + "anyOf": [ + { + "type": "string", + "maxLength": 1024, + "minLength": 3, + "pattern": "^s3://(\\w){1}(\\w-\\./)*(\\w){1}" + }, + { "type": "null" } + ], + "title": "Logs S3 Path", + "description": "S3 Path where to save logs and reports. If None, nothing will be uploaded.", + "examples": ["s3://example-bucket/logs"] + }, + "provenance_s3_path": { + "anyOf": [ + { + "type": "string", + "maxLength": 1024, + "minLength": 3, + "pattern": "^s3://(\\w){1}(\\w-\\./)*(\\w){1}" + }, + { "type": "null" } + ], + "title": "Provenance S3 Path", + "description": "S3 Path where to save provenance information. If None, nothing will be uploaded.", + "examples": ["s3://example-bucket/provenance"] + }, + "debug_s3_path": { + "anyOf": [ + { + "type": "string", + "maxLength": 1024, + "minLength": 3, + "pattern": "^s3://(\\w){1}(\\w-\\./)*(\\w){1}" + }, + { "type": "null" } + ], + "title": "Debug S3 Path", + "description": "S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.", + "examples": ["s3://example-bucket/debug"] + }, + "workflow_version_id": { + "type": "string", + "maxLength": 40, + "minLength": 40, + "pattern": "^[0-9a-f]{40}$", + "title": "Workflow Version Id", + "description": "Workflow version git commit hash", + "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"] + }, + "notes": { + "anyOf": [ + { "type": "string", "maxLength": 65536 }, + { "type": "null" } + ], + "title": "Notes", + "description": "Optional notes for this workflow execution", + "examples": ["Some workflow execution specific notes"] + }, + "mode_id": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "title": "Mode Id", + "description": "ID of the workflow mode this workflow execution runs in", + "examples": ["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"] + } + }, + "type": "object", + "required": ["parameters", "workflow_version_id"], + "title": "WorkflowExecutionIn" + }, + "WorkflowExecutionOut": { + "properties": { + "workflow_version_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Workflow Version Id", + "description": "Workflow version git commit hash", + "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"] + }, + "notes": { + "anyOf": [ + { "type": "string", "maxLength": 65536 }, + { "type": "null" } + ], + "title": "Notes", + "description": "Optional notes for this workflow execution", + "examples": ["Some workflow execution specific notes"] + }, + "mode_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Mode Id", + "description": "ID of the workflow mode this workflow execution runs in", + "examples": ["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"] + }, + "execution_id": { + "type": "string", + "title": "Execution Id", + "description": "ID of the workflow execution", + "examples": ["591b6a6e-a1f0-420d-8a20-a7a60704f695"] + }, + "executor_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Executor Id", + "description": "UID of user who started the workflow", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"] + }, + "start_time": { + "type": "integer", + "maximum": 4294967295.0, + "minimum": 1.0, + "title": "Start Time", + "description": "Start time of the workflow execution as UNIX timestamp", + "examples": [1640991600] + }, + "end_time": { + "anyOf": [ + { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 }, + { "type": "null" } + ], + "title": "End Time", + "description": "End time of the workflow execution as UNIX timestamp", + "examples": [1640991600] + }, + "status": { + "$ref": "#/components/schemas/WorkflowExecutionStatus", + "description": "Status of the workflow execution", + "examples": ["RUNNING"] + }, + "workflow_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Workflow Id", + "description": "Id of the workflow", + "examples": ["20128c04-e834-40a8-9878-68939ae46423"] + }, + "logs_s3_path": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Logs S3 Path", + "description": "S3 Path where logs and reports are saved.", + "examples": [ + "s3://example-bucket/logs/run-591b6a6ea1f0420d8a20a7a60704f695" + ] + }, + "provenance_s3_path": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Provenance S3 Path", + "description": "S3 Path where provenance information is saved.", + "examples": [ + "s3://example-bucket/provenance/run-591b6a6ea1f0420d8a20a7a60704f695" + ] + }, + "debug_s3_path": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Debug S3 Path", + "description": "S3 Path where debug information from Nextflow is saved.", + "examples": [ + "s3://example-bucket/debug/run-591b6a6ea1f0420d8a20a7a60704f695" + ] + }, + "cpu_time": { + "type": "string", + "format": "duration", + "title": "Cpu Time", + "description": "The consumed cpu time in ISO 8601 format", + "examples": ["P4DT12H30M5S"] + } + }, + "type": "object", + "required": ["execution_id", "start_time", "status", "cpu_time"], + "title": "WorkflowExecutionOut" + }, + "WorkflowExecutionStatus": { + "type": "string", + "enum": [ + "PENDING", + "SCHEDULED", + "RUNNING", + "CANCELED", + "SUCCESS", + "ERROR" + ], + "title": "WorkflowExecutionStatus", + "description": "Enumeration for the status on a workflow execution." + }, + "WorkflowIn": { + "properties": { + "name": { + "type": "string", + "maxLength": 64, + "minLength": 3, + "title": "Name", + "description": "Short descriptive name of the workflow", + "examples": ["RNA ReadMapper"] + }, + "short_description": { + "type": "string", + "maxLength": 256, + "minLength": 64, + "title": "Short Description", + "description": "Short description of the workflow", + "examples": [ + "This should be a very good example of a short and descriptive description" + ] + }, + "repository_url": { + "type": "string", + "minLength": 1, + "format": "uri", + "title": "Repository Url", + "description": "URL to the Git repository belonging to this workflow", + "examples": ["https://github.com/example-user/example"] + }, + "git_commit_hash": { + "type": "string", + "maxLength": 40, + "minLength": 40, + "pattern": "^[0-9a-f]{40}$", + "title": "Git Commit Hash", + "description": "Hash of the git commit", + "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"] + }, + "initial_version": { + "type": "string", + "maxLength": 10, + "minLength": 5, + "title": "Initial Version", + "description": "Version of the Workflow. Should follow semantic versioning", + "examples": ["v1.1.0"] + }, + "token": { + "anyOf": [ + { "type": "string", "maxLength": 128 }, + { "type": "null" } + ], + "title": "Token", + "description": "Token to access the content git repository", + "examples": ["vnpau89avpa48iunga984gh9h89pvhj"] + }, + "modes": { + "items": { "$ref": "#/components/schemas/WorkflowModeIn" }, + "type": "array", + "maxItems": 10, + "title": "Modes", + "description": "List of modes with alternative entrypoint the new workflow has", + "default": [] + }, + "nextflow_version": { + "$ref": "#/components/schemas/NextflowVersion", + "description": "The version of Nextflow this workflow version requires.", + "examples": ["24.04.4"] + } + }, + "type": "object", + "required": [ + "name", + "short_description", + "repository_url", + "git_commit_hash", + "initial_version", + "nextflow_version" + ], + "title": "WorkflowIn" + }, + "WorkflowModeIn": { + "properties": { + "schema_path": { + "type": "string", + "maxLength": 256, + "title": "Schema Path", + "description": "Path to the alternative parameter schema", + "examples": ["modes/schema1.json"] + }, + "entrypoint": { + "type": "string", + "maxLength": 256, + "title": "Entrypoint", + "description": "Name of the process the workflow should start with. Argument to the parameter '-entry'", + "examples": ["example"] + }, + "name": { + "type": "string", + "maxLength": 128, + "title": "Name", + "description": "Name of the workflow mode", + "examples": ["Example Name"] + } + }, + "type": "object", + "required": ["schema_path", "entrypoint", "name"], + "title": "WorkflowModeIn" + }, + "WorkflowModeOut": { + "properties": { + "schema_path": { + "type": "string", + "maxLength": 256, + "title": "Schema Path", + "description": "Path to the alternative parameter schema", + "examples": ["modes/schema1.json"] + }, + "entrypoint": { + "type": "string", + "maxLength": 256, + "title": "Entrypoint", + "description": "Name of the process the workflow should start with. Argument to the parameter '-entry'", + "examples": ["example"] + }, + "name": { + "type": "string", + "maxLength": 128, + "title": "Name", + "description": "Name of the workflow mode", + "examples": ["Example Name"] + }, + "mode_id": { + "type": "string", + "title": "Mode Id", + "description": "ID of the workflow mode", + "examples": ["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"] + } + }, + "type": "object", + "required": ["schema_path", "entrypoint", "name", "mode_id"], + "title": "WorkflowModeOut" + }, + "WorkflowOut": { + "properties": { + "name": { + "type": "string", + "maxLength": 64, + "minLength": 3, + "title": "Name", + "description": "Short descriptive name of the workflow", + "examples": ["RNA ReadMapper"] + }, + "short_description": { + "type": "string", + "maxLength": 256, + "minLength": 64, + "title": "Short Description", + "description": "Short description of the workflow", + "examples": [ + "This should be a very good example of a short and descriptive description" + ] + }, + "repository_url": { + "type": "string", + "minLength": 1, + "format": "uri", + "title": "Repository Url", + "description": "URL to the Git repository belonging to this workflow", + "examples": ["https://github.com/example-user/example"] + }, + "workflow_id": { + "type": "string", + "title": "Workflow Id", + "description": "ID of the workflow", + "examples": ["20128c04-e834-40a8-9878-68939ae46423"] + }, + "versions": { + "items": { "$ref": "#/components/schemas/WorkflowVersionOut" }, + "type": "array", + "title": "Versions", + "description": "Versions of the workflow" + }, + "developer_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Developer Id", + "description": "ID of developer of the workflow", + "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"] + }, + "private": { + "type": "boolean", + "title": "Private", + "description": "Flag if the workflow is hosted in a private git repository", + "default": false + } + }, + "type": "object", + "required": [ + "name", + "short_description", + "repository_url", + "workflow_id", + "versions" + ], + "title": "WorkflowOut" + }, + "WorkflowStatistic": { + "properties": { + "day": { + "type": "string", + "format": "date", + "title": "Day", + "description": "Day of the datapoint", + "examples": ["2023-01-01"] + }, + "count": { + "type": "integer", + "title": "Count", + "description": "Number of started workflows on that day", + "examples": [1] + } + }, + "type": "object", + "required": ["day", "count"], + "title": "WorkflowStatistic" + }, + "WorkflowUpdate": { + "properties": { + "version": { + "type": "string", + "maxLength": 10, + "minLength": 5, + "title": "Version", + "description": "Version of the Workflow. Should follow semantic versioning", + "examples": ["v1.1.0"] + }, + "git_commit_hash": { + "type": "string", + "maxLength": 40, + "minLength": 40, + "pattern": "^[0-9a-f]{40}$", + "title": "Git Commit Hash", + "description": "Hash of the git commit", + "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"] + }, + "append_modes": { + "items": { "$ref": "#/components/schemas/WorkflowModeIn" }, + "type": "array", + "title": "Append Modes", + "description": "Add modes to the new workflow version" + }, + "delete_modes": { + "items": { "type": "string", "format": "uuid" }, + "type": "array", + "title": "Delete Modes", + "description": "Delete modes for the new workflow version.", + "examples": ["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"] + } + }, + "type": "object", + "required": ["version", "git_commit_hash"], + "title": "WorkflowUpdate" + }, + "WorkflowVersionMetadataIn": { + "properties": { + "nextflow_version": { + "$ref": "#/components/schemas/NextflowVersion", + "description": "The version of Nextflow this workflow version requires.", + "examples": ["24.04.4"] + }, + "nextflow_config": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Nextflow Config", + "description": "Nextflow config that overrides the config in the git repository" + }, + "default_container": { + "anyOf": [ + { + "type": "string", + "pattern": ":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$" + }, + { "type": "null" } + ], + "title": "Default Container", + "description": "Default container to use for all Nextflow processes that have to container specified", + "examples": ["debian:12-slim"] + } + }, + "type": "object", + "required": ["nextflow_version"], + "title": "WorkflowVersionMetadataIn" + }, + "WorkflowVersionMetadataOut": { + "properties": { + "nextflow_version": { + "$ref": "#/components/schemas/NextflowVersion", + "description": "The version of Nextflow this workflow version requires.", + "examples": ["24.04.4"] + }, + "nextflow_config": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Nextflow Config", + "description": "Nextflow config that overrides the config in the git repository" + }, + "default_container": { + "anyOf": [ + { + "type": "string", + "pattern": ":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$" + }, + { "type": "null" } + ], + "title": "Default Container", + "description": "Default container to use for all Nextflow processes that have to container specified", + "examples": ["debian:12-slim"] + } + }, + "type": "object", + "required": ["nextflow_version"], + "title": "WorkflowVersionMetadataOut" + }, + "WorkflowVersionOut": { + "properties": { + "status": { + "$ref": "#/components/schemas/WorkflowVersionStatus", + "description": "Status of the workflow version", + "examples": ["PUBLISHED"] + }, + "workflow_id": { + "type": "string", + "title": "Workflow Id", + "description": "ID of the corresponding workflow", + "examples": ["20128c04-e834-40a8-9878-68939ae46423"] + }, + "version": { + "type": "string", + "maxLength": 10, + "minLength": 5, + "title": "Version", + "description": "Version of the Workflow. Should follow semantic versioning", + "examples": ["v1.1.0"] + }, + "icon_url": { + "anyOf": [ + { "type": "string", "minLength": 1, "format": "uri" }, + { "type": "null" } + ], + "title": "Icon Url", + "description": "URL to the uploaded icon", + "examples": [ + "https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png" + ] + }, + "workflow_version_id": { + "type": "string", + "maxLength": 40, + "minLength": 40, + "pattern": "^[0-9a-f]{40}$", + "title": "Workflow Version Id", + "description": "Hash of the git commit", + "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"] + }, + "created_at": { + "type": "integer", + "maximum": 4294967295.0, + "minimum": 1.0, + "title": "Created At", + "description": "Timestamp when the version was created as UNIX timestamp", + "examples": [1640991600] + }, + "modes": { + "items": { "type": "string" }, + "type": "array", + "title": "Modes", + "description": "Optional modes his workflow version has", + "default": [], + "examples": ["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"] + }, + "parameter_extension": { + "anyOf": [ + { "$ref": "#/components/schemas/ParameterExtension-Output" }, + { "type": "null" } + ], + "description": "Parameter extension specific for this CloWM instance" + }, + "nextflow_version": { + "$ref": "#/components/schemas/NextflowVersion", + "description": "The version of Nextflow this workflow version requires.", + "examples": ["24.04.4"] + } + }, + "type": "object", + "required": [ + "status", + "workflow_id", + "version", + "workflow_version_id", + "created_at", + "nextflow_version" + ], + "title": "WorkflowVersionOut" + }, + "WorkflowVersionStatus": { + "type": "string", + "enum": ["CREATED", "DENIED", "PUBLISHED", "DEPRECATED"], + "title": "WorkflowVersionStatus", + "description": "Enumeration for the possible status of a workflow version." + }, + "WorkflowVersionStatusSchema": { + "properties": { + "status": { + "$ref": "#/components/schemas/WorkflowVersionStatus", + "description": "Status of the workflow version", + "examples": ["PUBLISHED"] + } + }, + "type": "object", + "required": ["status"], + "title": "WorkflowVersionStatusSchema" + } + }, + "securitySchemes": { + "Session Token": { + "type": "apiKey", + "description": "The JWT in this cookie is used by the website and should not be used when communicating directly with the API.", + "in": "cookie", + "name": "clowm-jwt" + } + } + } +} diff --git a/package-lock.json b/package-lock.json index 35360ce..e8c29ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,7 +49,7 @@ "@vue/eslint-config-prettier": "~10.2.0", "@vue/eslint-config-typescript": "~14.4.0", "@vue/tsconfig": "~0.7.0", - "eslint": "~9.20.0", + "eslint": "~9.21.0", "eslint-plugin-vue": "~9.32.0", "highlight.js": "^11.9.0", "prettier": "~3.5.0", @@ -2050,9 +2050,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz", - "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2063,9 +2063,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz", + "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2135,9 +2135,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.20.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz", - "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==", + "version": "9.21.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.21.0.tgz", + "integrity": "sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==", "dev": true, "license": "MIT", "engines": { @@ -2168,19 +2168,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", - "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@fortawesome/fontawesome-free": { "version": "6.7.2", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz", @@ -3871,9 +3858,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.13.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", - "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", + "version": "22.13.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.5.tgz", + "integrity": "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==", "dev": true, "license": "MIT", "dependencies": { @@ -4291,9 +4278,9 @@ } }, "node_modules/@vue/devtools-core/node_modules/nanoid": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.0.tgz", - "integrity": "sha512-zDAl/llz8Ue/EblwSYwdxGBYfj46IM1dhjVi8dyp9LQffoIGxJEAHj2oeZ4uNcgycSRcQ83CnfcZqEJzVDLcDw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", + "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==", "dev": true, "funding": [ { @@ -4382,9 +4369,9 @@ } }, "node_modules/@vue/language-core": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.2.tgz", - "integrity": "sha512-QotO41kurE5PLf3vrNgGTk3QswO2PdUFjBwNiOi7zMmGhwb25PSTh9hD1MCgKC06AVv+8sZQvlL3Do4TTVHSiQ==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.4.tgz", + "integrity": "sha512-eGGdw7eWUwdIn9Fy/irJ7uavCGfgemuHQABgJ/hU1UgZFnbTg9VWeXvHQdhY+2SPQZWJqWXvRWIg67t4iWEa+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5586,9 +5573,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.102", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.102.tgz", - "integrity": "sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==", + "version": "1.5.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.103.tgz", + "integrity": "sha512-P6+XzIkfndgsrjROJWfSvVEgNHtPgbhVyTkwLjUM2HU/h7pZRORgaTlHqfAikqxKmdJMLW8fftrdGWbd/Ds0FA==", "dev": true, "license": "ISC" }, @@ -5748,22 +5735,22 @@ } }, "node_modules/eslint": { - "version": "9.20.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.1.tgz", - "integrity": "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==", + "version": "9.21.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.21.0.tgz", + "integrity": "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.11.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.20.0", - "@eslint/plugin-kit": "^0.2.5", + "@eslint/config-array": "^0.19.2", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.0", + "@eslint/js": "9.21.0", + "@eslint/plugin-kit": "^0.2.7", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", + "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -6434,17 +6421,17 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "get-proto": "^1.0.0", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", @@ -6488,9 +6475,9 @@ } }, "node_modules/giget": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.4.tgz", - "integrity": "sha512-Wv+daGyispVoA31TrWAVR+aAdP7roubTPEM/8JzRnqXhLbdJH0T9eQyXVFF8fjk3WKTsctII6QcyxILYgNp2DA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.5.tgz", + "integrity": "sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug==", "dev": true, "license": "MIT", "dependencies": { @@ -6498,9 +6485,8 @@ "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", - "nypm": "^0.5.1", - "ohash": "^1.1.4", - "pathe": "^2.0.2", + "nypm": "^0.5.4", + "pathe": "^2.0.3", "tar": "^6.2.1" }, "bin": { @@ -8091,9 +8077,9 @@ } }, "node_modules/prettier": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.1.tgz", - "integrity": "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.2.tgz", + "integrity": "sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==", "dev": true, "license": "MIT", "bin": { @@ -9463,14 +9449,14 @@ "license": "MIT" }, "node_modules/vue-tsc": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.2.tgz", - "integrity": "sha512-1icPKkxAA5KTAaSwg0wVWdE48EdsH8fgvcbAiqojP4jXKl6LEM3soiW1aG/zrWrFt8Mw1ncG2vG1PvpZpVfehA==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.4.tgz", + "integrity": "sha512-3EVHlxtpMXcb5bCaK7QDFTbEkMusDfVk0HVRrkv5hEb+Clpu9a96lKUXJAeD/akRlkoA4H8MCHgBDN19S6FnzA==", "dev": true, "license": "MIT", "dependencies": { "@volar/typescript": "~2.4.11", - "@vue/language-core": "2.2.2" + "@vue/language-core": "2.2.4" }, "bin": { "vue-tsc": "bin/vue-tsc.js" diff --git a/package.json b/package.json index f493ba0..3c83d6a 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "@vue/eslint-config-prettier": "~10.2.0", "@vue/eslint-config-typescript": "~14.4.0", "@vue/tsconfig": "~0.7.0", - "eslint": "~9.20.0", + "eslint": "~9.21.0", "eslint-plugin-vue": "~9.32.0", "highlight.js": "^11.9.0", "prettier": "~3.5.0", diff --git a/src/App.vue b/src/App.vue index a0ea967..5e39972 100644 --- a/src/App.vue +++ b/src/App.vue @@ -197,8 +197,9 @@ onMounted(() => { modal-id="welcome-modal" modal-label="Welcome Modal" static-backdrop + size-modifier-modal="xl" > - <template #header>Hello to CloWM</template> + <template #header>Welcome to CloWM</template> <template #body>This is your first time in CloWM</template> </bootstrap-modal> <router-view /> diff --git a/src/client/types.gen.ts b/src/client/types.gen.ts index c9c0003..39d47ee 100644 --- a/src/client/types.gen.ts +++ b/src/client/types.gen.ts @@ -434,6 +434,10 @@ export enum NextflowVersion { "24_04_3" = "24.04.3", "24_04_4" = "24.04.4", "24_10_0" = "24.10.0", + "24_10_1" = "24.10.1", + "24_10_2" = "24.10.2", + "24_10_3" = "24.10.3", + "24_10_4" = "24.10.4", } export enum OidcProvider { diff --git a/src/views/SignupView.vue b/src/views/SignupView.vue index 734a1ac..f57cc22 100644 --- a/src/views/SignupView.vue +++ b/src/views/SignupView.vue @@ -35,22 +35,31 @@ onBeforeUnmount(() => { <p> The only prerequisite for using CloWM is a <a href="https://lifescience-ri.eu/">LifeScience</a> or - <a href="https://iam.services.base4nfdi.de">NFDI</a> + <a href="https://iam.services.base4nfdi.de">NFDI AAI</a> account. </p> <h4>I don't have such an Account</h4> + <h5>LifeScience AAI</h5> <p> - I you don't have a LifeScience account yet, you can register by going to the + You can register by going to the <a href="https://lifescience-ri.eu/ls-login/version-2023/user/how-to-get-ls-id.html" >LifeScience website</a > and follow the instructions there. </p> - <h4>I already have a LifeScience Account</h4> + <h5>NFDI AAI</h5> + <p> + The NFDI AAI maintains a list of + <a href="https://doc.nfdi-aai.de/community-aai-software/" + >connected Community AAIs</a + >. If you have an account at one of those AAIs, you can simply use the NFDI + AII + </p> + <h4>I already have such an account</h4> <p class="fs-6"> - Then you can simply log into CloWM by clicking the button below and a CloWM - account will be created automatically for you. + Then you can simply log into CloWM by clicking one of the buttons below and + a CloWM account will be created automatically for you. </p> <div class="d-flex flex-column mx-auto w-fit align-items-center mt-5"> <login-buttons :return-path="returnPath" /> diff --git a/src/views/admin/AdminBucketsView.vue b/src/views/admin/AdminBucketsView.vue index 4e3e137..86ef666 100644 --- a/src/views/admin/AdminBucketsView.vue +++ b/src/views/admin/AdminBucketsView.vue @@ -1,5 +1,5 @@ <script setup lang="ts"> -import { computed, reactive } from "vue"; +import { computed, onBeforeMount, reactive } from "vue"; import { BucketType } from "@/client/types.gen"; import type { BucketOut, UserOut } from "@/client/types.gen"; import SearchUserModal from "@/components/modals/SearchUserModal.vue"; @@ -11,22 +11,28 @@ import dayjs from "dayjs"; import UpdateBucketLimitsModal from "@/components/admin/UpdateBucketLimitsModal.vue"; import DeleteBucketModal from "@/components/object-storage/modals/DeleteBucketModal.vue"; import CreateOtrModal from "@/components/modals/CreateOtrModal.vue"; +import { useRoute, useRouter } from "vue-router"; +import { useUserStore } from "@/stores"; + +const filters = reactive<{ + searchString: string; + ownerId: string; +}>({ + searchString: "", + ownerId: "", +}); const bucketState = reactive<{ buckets: BucketOut[]; selectedBucket?: BucketOut; - ownerId: string; loading: boolean; searched: boolean; - filterString: string; updateLimitsBucket: BucketOut; }>({ buckets: [], selectedBucket: undefined, - ownerId: "", loading: false, searched: false, - filterString: "", updateLimitsBucket: { name: "", description: "", @@ -36,35 +42,40 @@ const bucketState = reactive<{ }, }); +const QUERY_PARAM_OWNER_ID = "owner_id"; +const QUERY_PARAM_BUCKET_NAME = "search"; + +const route = useRoute<"admin-buckets">(); +const router = useRouter(); + const bucketRepository = useBucketStore(); const nameRepository = useNameStore(); +const userRepository = useUserStore(); const updateLimitsModalId = "admin-update-bucket-limits-modal"; const filteredBuckets = computed<BucketOut[]>(() => bucketState.buckets.filter((bucket) => - bucket.name.includes(bucketState.filterString), + bucket.name.includes(filters.searchString), ), ); function updateUser(user: UserOut) { - bucketState.ownerId = user.uid; + filters.ownerId = user.uid; } function resetForm() { - bucketState.ownerId = ""; - bucketState.filterString = ""; + filters.ownerId = ""; + filters.searchString = ""; bucketState.buckets = []; bucketState.searched = false; + router.replace({ name: "admin-buckets" }); } function searchBuckets() { bucketState.loading = true; bucketRepository - .fetchBuckets( - bucketState.ownerId ? bucketState.ownerId : undefined, - BucketType.OWN, - ) + .fetchBuckets(filters.ownerId ? filters.ownerId : undefined, BucketType.OWN) .then((buckets) => { bucketState.buckets = buckets; }) @@ -72,6 +83,17 @@ function searchBuckets() { bucketState.loading = false; bucketState.searched = true; }); + const queryParams: Record<string, string> = {}; + if (filters.ownerId.length > 0) { + queryParams[QUERY_PARAM_OWNER_ID] = filters.ownerId; + } + if (filters.searchString.trim().length > 0) { + queryParams[QUERY_PARAM_BUCKET_NAME] = filters.searchString.trim(); + } + router.replace({ + name: "admin-buckets", + query: queryParams, + }); } function deleteBucket(bucketName: string) { @@ -95,6 +117,26 @@ function limitsUpdated(bucket: BucketOut) { bucketState.buckets[bucketIndex] = bucket; } } + +onBeforeMount(() => { + let search = false; + if (route.query[QUERY_PARAM_OWNER_ID] != undefined) { + if (typeof route.query[QUERY_PARAM_OWNER_ID] === "string") { + filters.ownerId = route.query[QUERY_PARAM_OWNER_ID]; + userRepository.fetchUsernames([route.query[QUERY_PARAM_OWNER_ID]]); + search = true; + } + } + if (route.query[QUERY_PARAM_BUCKET_NAME] != undefined) { + if (typeof route.query[QUERY_PARAM_BUCKET_NAME] === "string") { + filters.searchString = route.query[QUERY_PARAM_BUCKET_NAME]; + search = true; + } + } + if (search) { + searchBuckets(); + } +}); </script> <template> @@ -127,7 +169,11 @@ function limitsUpdated(bucket: BucketOut) { <div class="border-bottom mb-4"> <h2>Manage Buckets</h2> </div> - <form id="admin-bucket-search-form" @submit.prevent="searchBuckets"> + <form + id="admin-bucket-search-form" + @submit.prevent="searchBuckets" + @reset.prevent="resetForm" + > <div class="d-flex justify-content-evenly align-content-center mb-4 column-gap-2 flex-wrap" > @@ -141,7 +187,7 @@ function limitsUpdated(bucket: BucketOut) { </div> <input id="admin-bucket-name-search" - v-model.trim="bucketState.filterString" + v-model.trim="filters.searchString" type="search" class="form-control" placeholder="Search Buckets" @@ -162,7 +208,7 @@ function limitsUpdated(bucket: BucketOut) { type="text" class="form-control" readonly - :value="nameRepository.getName(bucketState.ownerId)" + :value="nameRepository.getName(filters.ownerId)" placeholder="Search for owner" data-bs-toggle="modal" data-bs-target="#admin-bucket-search-user-modal" @@ -178,10 +224,9 @@ function limitsUpdated(bucket: BucketOut) { Search </button> <button - type="button" + type="reset" class="btn-primary btn w-fit ms-4" :disabled="bucketState.loading" - @click="resetForm" > Reset </button> diff --git a/src/views/admin/AdminResourcesView.vue b/src/views/admin/AdminResourcesView.vue index 27f2ee8..06a2ad6 100644 --- a/src/views/admin/AdminResourcesView.vue +++ b/src/views/admin/AdminResourcesView.vue @@ -1,6 +1,5 @@ <script setup lang="ts"> -import { useResourceStore } from "@/stores/resources"; -import { reactive } from "vue"; +import { onBeforeMount, reactive } from "vue"; import { ResourceVersionStatus } from "@/client/types.gen"; import type { ResourceOut, @@ -8,22 +7,37 @@ import type { UserOut, } from "@/client/types.gen"; import SearchUserModal from "@/components/modals/SearchUserModal.vue"; -import { useNameStore } from "@/stores/names"; import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; import dayjs from "dayjs"; import ResourceVersionInfoModal from "@/components/resources/modals/ResourceVersionInfoModal.vue"; import DeleteResourceModal from "@/components/resources/modals/DeleteResourceModal.vue"; import CreateOtrModal from "@/components/modals/CreateOtrModal.vue"; +import { useRoute, useRouter } from "vue-router"; +import { useUserStore, useNameStore, useResourceStore } from "@/stores"; const resourceRepository = useResourceStore(); const nameRepository = useNameStore(); +const userRepository = useUserStore(); +const route = useRoute<"admin-resources">(); +const router = useRouter(); -const resourceState = reactive<{ - loading: boolean; - resources: ResourceOut[]; +const QUERY_PARAM_MAINTAINER = "maintainer_id"; +const QUERY_PARAM_SEARCH_NAME = "search"; +const QUERY_PARAM_STATUS = "status"; + +const filters = reactive<{ maintainerId: string; searchString: string; resourceStatus: ResourceVersionStatus[]; +}>({ + maintainerId: "", + searchString: "", + resourceStatus: [], +}); + +const resourceState = reactive<{ + loading: boolean; + resources: ResourceOut[]; inspectVersionIndex: number; inspectResource?: ResourceOut; searched: boolean; @@ -31,9 +45,6 @@ const resourceState = reactive<{ }>({ loading: false, resources: [], - maintainerId: "", - searchString: "", - resourceStatus: [], inspectVersionIndex: 0, inspectResource: undefined, searched: false, @@ -41,7 +52,7 @@ const resourceState = reactive<{ }); function updateUser(user: UserOut) { - resourceState.maintainerId = user.uid; + filters.maintainerId = user.uid; } function deleteResource(resourceId: string) { @@ -61,9 +72,9 @@ function searchResources() { resourceState.loading = true; resourceRepository .fetchResources( - resourceState.maintainerId ? resourceState.maintainerId : undefined, - resourceState.resourceStatus ? resourceState.resourceStatus : undefined, - resourceState.searchString ? resourceState.searchString : undefined, + filters.maintainerId ? filters.maintainerId : undefined, + filters.resourceStatus ? filters.resourceStatus : undefined, + filters.searchString ? filters.searchString : undefined, ) .then((resources) => { resourceState.resources = resources; @@ -72,6 +83,17 @@ function searchResources() { resourceState.loading = false; resourceState.searched = true; }); + const queryParams: Record<string, string | string[]> = {}; + if (filters.searchString.trim().length > 0) { + queryParams[QUERY_PARAM_SEARCH_NAME] = filters.searchString.trim(); + } + if (filters.maintainerId.length > 0) { + queryParams[QUERY_PARAM_MAINTAINER] = filters.maintainerId; + } + if (filters.resourceStatus.length > 0) { + queryParams[QUERY_PARAM_STATUS] = filters.resourceStatus; + } + router.replace({ name: "admin-resources", query: queryParams }); } function replaceResourceVersion( @@ -135,12 +157,45 @@ function syncToCluster(resourceVersion: ResourceVersionOut) { } function resetForm() { - resourceState.maintainerId = ""; - resourceState.searchString = ""; - resourceState.resourceStatus = []; + filters.maintainerId = ""; + filters.searchString = ""; + filters.resourceStatus = []; resourceState.resources = []; resourceState.searched = false; + router.replace({ name: "admin-resources" }); } + +onBeforeMount(() => { + let search = false; + if (route.query[QUERY_PARAM_MAINTAINER] != undefined) { + if (typeof route.query[QUERY_PARAM_MAINTAINER] === "string") { + filters.maintainerId = route.query[QUERY_PARAM_MAINTAINER]; + userRepository.fetchUsernames([route.query[QUERY_PARAM_MAINTAINER]]); + search = true; + } + } + if (route.query[QUERY_PARAM_SEARCH_NAME] != undefined) { + if (typeof route.query[QUERY_PARAM_SEARCH_NAME] === "string") { + filters.searchString = route.query[QUERY_PARAM_SEARCH_NAME]; + search = true; + } + } + if (route.query[QUERY_PARAM_STATUS] != undefined) { + if (typeof route.query[QUERY_PARAM_STATUS] === "string") { + filters.resourceStatus = [ + route.query[QUERY_PARAM_STATUS] as ResourceVersionStatus, + ]; + } else { + filters.resourceStatus = route.query[QUERY_PARAM_STATUS].filter( + (val) => val != undefined, + ).map((val) => val as ResourceVersionStatus); + } + search = filters.resourceStatus.length > 0 || search; + } + if (search) { + searchResources(); + } +}); </script> <template> @@ -176,7 +231,11 @@ function resetForm() { > <h2>Manage Resources</h2> </div> - <form id="admin-resource-search-form" @submit.prevent="searchResources"> + <form + id="admin-resource-search-form" + @submit.prevent="searchResources" + @reset.prevent="resetForm" + > <div class="d-flex justify-content-evenly align-content-center flex-wrap column-gap-2 mb-2" > @@ -186,7 +245,7 @@ function resetForm() { > <select id="admin-resource-state-select" - v-model="resourceState.resourceStatus" + v-model="filters.resourceStatus" multiple class="form-select w-fit" > @@ -208,7 +267,7 @@ function resetForm() { </div> <input id="admin-resource-name-search" - v-model="resourceState.searchString" + v-model="filters.searchString" type="search" class="form-control" maxlength="32" @@ -229,7 +288,7 @@ function resetForm() { type="text" class="form-control" readonly - :value="nameRepository.getName(resourceState.maintainerId)" + :value="nameRepository.getName(filters.maintainerId)" placeholder="Search for maintainer" data-bs-toggle="modal" data-bs-target="#admin-resource-search-user-modal" @@ -245,10 +304,9 @@ function resetForm() { Search </button> <button - type="button" + type="reset" class="btn-primary btn w-fit ms-4" :disabled="resourceState.loading" - @click="resetForm" > Reset </button> diff --git a/src/views/admin/AdminUsersView.vue b/src/views/admin/AdminUsersView.vue index cebd4fa..e616be5 100644 --- a/src/views/admin/AdminUsersView.vue +++ b/src/views/admin/AdminUsersView.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> import { useUserStore } from "@/stores/users"; -import { onMounted, reactive } from "vue"; +import { onBeforeMount, onMounted, reactive } from "vue"; import { RoleEnum, type UserOutExtended, @@ -11,13 +11,27 @@ import BootstrapToast from "@/components/BootstrapToast.vue"; import { Toast } from "bootstrap"; import CreateUserModal from "@/components/admin/CreateUserModal.vue"; import DeleteUserModal from "@/components/modals/DeleteUserModal.vue"; +import { useRoute, useRouter } from "vue-router"; const userRepository = useUserStore(); +const route = useRoute<"admin-users">(); +const router = useRouter(); type RoleList = RoleEnum[]; let successRoleToast: Toast | undefined; let successInvitationToast: Toast | undefined; let errorToast: Toast | undefined; +const QUERY_PARAM_ROLE = "role"; +const QUERY_PARAM_NAME_SEARCH = "search"; + +const filters = reactive<{ + searchString: string; + roles: RoleEnum[]; +}>({ + searchString: "", + roles: [], +}); + const userState = reactive<{ loading: boolean; users: UserOutExtended[]; @@ -25,8 +39,6 @@ const userState = reactive<{ editUserRoles: boolean[]; editedUser?: UserOutExtended; errorMessage: string; - searchString: string; - userRoles: RoleEnum[]; inspectUser?: UserOutExtended; searched: boolean; selectedUser?: UserOut; @@ -37,8 +49,6 @@ const userState = reactive<{ editUserRoles: [], editedUser: undefined, errorMessage: "", - searchString: "", - userRoles: [], inspectUser: undefined, searched: false, selectedUser: undefined, @@ -48,8 +58,8 @@ function searchUsers() { userState.loading = true; userRepository .fetchUsers( - userState.searchString ? userState.searchString : undefined, - userState.userRoles ? userState.userRoles : undefined, + filters.searchString ? filters.searchString : undefined, + filters.roles ? filters.roles : undefined, ) .then((users) => { userState.users = users; @@ -60,6 +70,22 @@ function searchUsers() { userState.loading = false; userState.searched = true; }); + const queryParams: Record<string, string | string[]> = {}; + if (filters.roles.length > 0) { + queryParams[QUERY_PARAM_ROLE] = filters.roles; + } + if (filters.searchString.trim().length > 0) { + queryParams[QUERY_PARAM_NAME_SEARCH] = filters.searchString; + } + router.replace({ name: "admin-users", query: queryParams }); +} + +function resetForm() { + filters.searchString = ""; + filters.roles = []; + userState.users = []; + userState.searched = false; + router.replace({ name: "admin-users" }); } function saveUserRoles(index: number) { @@ -116,6 +142,29 @@ onMounted(() => { successInvitationToast = new Toast("#resend-invitation-success-toast"); errorToast = new Toast("#change-role-error-toast"); }); + +onBeforeMount(() => { + let search = false; + if (route.query[QUERY_PARAM_ROLE] != undefined) { + if (typeof route.query[QUERY_PARAM_ROLE] === "string") { + filters.roles = [route.query[QUERY_PARAM_ROLE] as RoleEnum]; + } else { + filters.roles = route.query[QUERY_PARAM_ROLE].filter( + (val) => val != undefined, + ).map((val) => val as RoleEnum); + } + search = filters.roles.length > 0 || search; + } + if (route.query[QUERY_PARAM_NAME_SEARCH] != undefined) { + if (typeof route.query[QUERY_PARAM_NAME_SEARCH] === "string") { + filters.searchString = route.query[QUERY_PARAM_NAME_SEARCH]; + search = true; + } + } + if (search) { + searchUsers(); + } +}); </script> <template> @@ -151,7 +200,11 @@ onMounted(() => { Invite User </button> </div> - <form id="admin-user-search-form" @submit.prevent="searchUsers"> + <form + id="admin-user-search-form" + @submit.prevent="searchUsers" + @reset.prevent="resetForm" + > <div class="d-flex justify-content-evenly align-content-center column-gap-3 flex-wrap mb-2" > @@ -161,7 +214,7 @@ onMounted(() => { > <select id="admin-user-state-select" - v-model="userState.userRoles" + v-model="filters.roles" multiple class="form-select w-fit" > @@ -180,7 +233,7 @@ onMounted(() => { </div> <input id="admin-user-name-search" - v-model="userState.searchString" + v-model="filters.searchString" type="search" class="form-control" maxlength="32" @@ -197,6 +250,13 @@ onMounted(() => { > Search </button> + <button + type="reset" + class="btn btn-primary w-fit ms-4" + :disabled="userState.loading" + > + Reset + </button> </form> <div v-if="userState.users" class="overflow-x-auto" style="max-width: 100vw"> <table class="table table-striped align-middle caption-top"> @@ -334,6 +394,41 @@ onMounted(() => { >Resend invitation email</a > </li> + <li> + <router-link + :to="{ + name: 'admin-buckets', + query: { owner_id: user.uid }, + }" + class="dropdown-item" + >View Buckets + </router-link> + </li> + <li> + <router-link + :to="{ + name: 'admin-executions', + query: { executor_id: user.uid }, + }" + class="dropdown-item" + >View Workflow executions + </router-link> + </li> + <li + v-if=" + user.roles.includes(RoleEnum.DB_MAINTAINER) || + user.roles.includes(RoleEnum.ADMINISTRATOR) + " + > + <router-link + :to="{ + name: 'admin-resources', + query: { maintainer_id: user.uid }, + }" + class="dropdown-item" + >View Resources + </router-link> + </li> <li v-if="user.uid !== userRepository.currentUID"> <button type="button" diff --git a/src/views/admin/AdminWorkflowExecutionView.vue b/src/views/admin/AdminWorkflowExecutionView.vue index 13f5940..7c0f17d 100644 --- a/src/views/admin/AdminWorkflowExecutionView.vue +++ b/src/views/admin/AdminWorkflowExecutionView.vue @@ -1,5 +1,12 @@ <script setup lang="ts"> -import { computed, nextTick, onMounted, reactive, ref } from "vue"; +import { + computed, + nextTick, + onBeforeMount, + onMounted, + reactive, + ref, +} from "vue"; import type { UserOut, WorkflowExecutionOut, @@ -16,9 +23,15 @@ import dayjs from "dayjs"; import ParameterModal from "@/components/workflows/modals/ParameterModal.vue"; import MarkdownRenderer from "@/components/MarkdownRenderer.vue"; import DeleteExecutionModal from "@/components/workflows/modals/DeleteExecutionModal.vue"; +import { useRoute, useRouter } from "vue-router"; +import { useUserStore } from "@/stores"; const executionRepository = useWorkflowExecutionStore(); const nameRepository = useNameStore(); +const userRepository = useUserStore(); + +const route = useRoute<"admin-executions">(); +const router = useRouter(); const statusToColorMapping = { PENDING: "bg-warning", @@ -29,6 +42,14 @@ const statusToColorMapping = { ERROR: "bg-danger", }; +const QUERY_PARAM_EXECUTOR_ID = "executor_id"; +const QUERY_PARAM_EXECUTION_STATUS = "status"; +const QUERY_PARAM_VERSION_ID = "version_id"; +const QUERY_PARAM_START_AFTER = "start_after"; +const QUERY_PARAM_START_BEFORE = "start_before"; +const QUERY_PARAM_SORT = "sort"; +const QUERY_PARAM_WORKFLOW_ID = "workflow_id"; + let loadingObserver: IntersectionObserver; const endOfTableElement = ref<HTMLTableCaptionElement | undefined>(undefined); @@ -90,7 +111,7 @@ function updateWorkflow( } function searchExecution() { - loadingObserver.disconnect(); + loadingObserver?.disconnect(); formState.loading = true; formState.executions = []; executionIterator.value = executionRepository.fetchExecutionsRaw( @@ -104,6 +125,27 @@ function searchExecution() { filters.sort, ); loadNextExecutions(); + const queryParams: Record<string, string | string[]> = {}; + if (filters.workflowVersionId != undefined) { + queryParams[QUERY_PARAM_VERSION_ID] = filters.workflowVersionId; + } + if (filters.executionStatus.length > 0) { + queryParams[QUERY_PARAM_EXECUTION_STATUS] = filters.executionStatus; + } + queryParams[QUERY_PARAM_SORT] = filters.sort; + if (filters.executorId != undefined) { + queryParams[QUERY_PARAM_EXECUTOR_ID] = filters.executorId; + } + if (filters.startAfter != undefined) { + queryParams[QUERY_PARAM_START_AFTER] = filters.startAfter.toString(); + } + if (filters.startBefore != undefined) { + queryParams[QUERY_PARAM_START_BEFORE] = filters.startBefore.toString(); + } + if (filters.workflowId != undefined) { + queryParams[QUERY_PARAM_WORKFLOW_ID] = filters.workflowId; + } + router.replace({ name: "admin-executions", query: queryParams }); } function loadNextExecutions() { @@ -175,8 +217,77 @@ function resetForm() { filters.sort = "desc"; executionIterator.value = undefined; formState.executions = []; + router.replace({ name: "admin-executions" }); } +onBeforeMount(() => { + let search = false; + if (route.query[QUERY_PARAM_EXECUTOR_ID] != undefined) { + if (typeof route.query[QUERY_PARAM_EXECUTOR_ID] === "string") { + filters.executorId = route.query[QUERY_PARAM_EXECUTOR_ID]; + userRepository.fetchUsernames([route.query[QUERY_PARAM_EXECUTOR_ID]]); + search = true; + } + } + if (route.query[QUERY_PARAM_VERSION_ID] != undefined) { + if (typeof route.query[QUERY_PARAM_VERSION_ID] === "string") { + filters.workflowVersionId = route.query[QUERY_PARAM_VERSION_ID]; + search = true; + } + } + if (route.query[QUERY_PARAM_WORKFLOW_ID] != undefined) { + if (typeof route.query[QUERY_PARAM_WORKFLOW_ID] === "string") { + filters.workflowId = route.query[QUERY_PARAM_WORKFLOW_ID]; + search = true; + } + } + if (route.query[QUERY_PARAM_START_AFTER] != undefined) { + if (typeof route.query[QUERY_PARAM_START_AFTER] === "string") { + const startAfter = Number(route.query[QUERY_PARAM_START_AFTER]); + if (!isNaN(startAfter)) { + filters.startAfter = startAfter; + search = true; + } + } + } + if (route.query[QUERY_PARAM_START_BEFORE] != undefined) { + if (typeof route.query[QUERY_PARAM_START_BEFORE] === "string") { + const startBefore = Number(route.query[QUERY_PARAM_START_BEFORE]); + if (!isNaN(startBefore)) { + filters.startBefore = startBefore; + search = true; + } + } + } + if (route.query[QUERY_PARAM_EXECUTION_STATUS] != undefined) { + if (typeof route.query[QUERY_PARAM_EXECUTION_STATUS] === "string") { + filters.executionStatus = [ + route.query[QUERY_PARAM_EXECUTION_STATUS] as WorkflowExecutionStatus, + ]; + } else { + filters.executionStatus = route.query[ + QUERY_PARAM_EXECUTION_STATUS + ].filter((val) => val != undefined).map( + (val) => val as WorkflowExecutionStatus, + ); + } + search = filters.executionStatus.length > 0 || search; + } + if (route.query[QUERY_PARAM_SORT] != undefined) { + if ( + typeof route.query[QUERY_PARAM_SORT] === "string" && + (route.query[QUERY_PARAM_SORT] === "asc" || + route.query[QUERY_PARAM_SORT] === "desc") + ) { + filters.sort = route.query[QUERY_PARAM_SORT]; + search = true; + } + } + if (search) { + searchExecution(); + } +}); + onMounted(() => { loadingObserver = new IntersectionObserver( (entries) => { @@ -215,7 +326,11 @@ onMounted(() => { <div class="border-bottom mb-4"> <h2>Search Workflow Execution</h2> </div> - <form id="admin-execution-search-form" @submit.prevent="searchExecution"> + <form + id="admin-execution-search-form" + @submit.prevent="searchExecution" + @reset.prevent="resetForm" + > <div class="d-flex justify-content-evenly align-content-center mb-4 column-gap-2 flex-wrap" > @@ -355,10 +470,9 @@ onMounted(() => { Search </button> <button - type="button" + type="reset" class="btn-primary btn w-fit ms-4" :disabled="formState.loading" - @click="resetForm" > Clear </button> diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue index 57d47b9..0b05c38 100644 --- a/src/views/user/ProfileView.vue +++ b/src/views/user/ProfileView.vue @@ -279,7 +279,7 @@ onMounted(() => { </div> <p> This action deletes your account and you lose access to everything in - CloWM that is connected to your it. <b>There is no going back.</b> + CloWM that is connected to it. <b>There is no going back.</b> </p> <button role="button" -- GitLab From 56a9827b80cd49124dc6b628d7afbd769c22924e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Mon, 24 Feb 2025 14:36:46 +0000 Subject: [PATCH 22/25] Show last login timestamp for users #191 --- openapi-clowm.json | 5 +++++ src/client/types.gen.ts | 4 ++++ src/views/admin/AdminUsersView.vue | 9 ++++++++- src/views/user/ProfileView.vue | 7 ++++++- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/openapi-clowm.json b/openapi-clowm.json index 723fc4a..f555678 100644 --- a/openapi-clowm.json +++ b/openapi-clowm.json @@ -6549,6 +6549,11 @@ "description": "Email of the user", "examples": ["user@example.org"] }, + "last_login": { + "anyOf": [{ "type": "integer" }, { "type": "null" }], + "title": "Last Login", + "description": "Timestamp when the user last logged in" + }, "gravatar_url": { "type": "string", "minLength": 1, diff --git a/src/client/types.gen.ts b/src/client/types.gen.ts index 39d47ee..db520cd 100644 --- a/src/client/types.gen.ts +++ b/src/client/types.gen.ts @@ -786,6 +786,10 @@ export type UserOutExtended = { * Email of the user */ email?: string | null; + /** + * Timestamp when the user last logged in + */ + last_login?: number | null; /** * URL to the gravatar avatar based on the users email */ diff --git a/src/views/admin/AdminUsersView.vue b/src/views/admin/AdminUsersView.vue index e616be5..ed5822f 100644 --- a/src/views/admin/AdminUsersView.vue +++ b/src/views/admin/AdminUsersView.vue @@ -12,6 +12,7 @@ import { Toast } from "bootstrap"; import CreateUserModal from "@/components/admin/CreateUserModal.vue"; import DeleteUserModal from "@/components/modals/DeleteUserModal.vue"; import { useRoute, useRouter } from "vue-router"; +import dayjs from "dayjs"; const userRepository = useUserStore(); const route = useRoute<"admin-users">(); @@ -272,6 +273,7 @@ onBeforeMount(() => { <th scope="col"><b>Name</b></th> <th scope="col">UID</th> <th scope="col">Email</th> + <th scope="col">Last Login</th> <th scope="col">Lifescience AAI</th> <th scope="col">NFDI AAI</th> <th @@ -287,7 +289,7 @@ onBeforeMount(() => { </thead> <tbody v-if="userState.users.length === 0"> <tr> - <td colspan="11" class="text-center fst-italic fw-light"> + <td colspan="12" class="text-center fst-italic fw-light"> <template v-if="userState.searched" >No Users found with specified filters </template> @@ -313,6 +315,11 @@ onBeforeMount(() => { user.email }}</a> </td> + <td> + <span v-if="user.last_login">{{ + dayjs.unix(user.last_login).fromNow() + }}</span> + </td> <td> <input type="checkbox" diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue index 0b05c38..2b07838 100644 --- a/src/views/user/ProfileView.vue +++ b/src/views/user/ProfileView.vue @@ -10,6 +10,7 @@ import { OidcProvider, } from "@/client/types.gen.ts"; import { client } from "@/client/client.gen.ts"; +import dayjs from "dayjs"; const userRepository = useUserStore(); const props = defineProps<{ @@ -90,6 +91,10 @@ onMounted(() => { Name: {{ userRepository.user?.display_name }}<br /> Email: {{ userRepository.user?.email }}<br /> CloWM ID: {{ userRepository.currentUID }}<br /> + <span v-if="userRepository.user?.last_login" + >Last Login: + {{ dayjs.unix(userRepository.user?.last_login).fromNow() }}</span + > </div> </div> <div> @@ -138,7 +143,7 @@ onMounted(() => { By connecting and expanding Identity and Access Management (IAM) systems, the IAM4NFDI initiative enables researchers across Germany and worldwide to seamlessly access tools, data, and services within - the National Research Data Infrastructure (NFDI) + the National Research Data Infrastructure (NFDI). </p> <div v-if="userRepository.user?.nfdi_id"> <b>Linked account: </b -- GitLab From 44ea37a067189ff51ad17898c3c76c9c64189c60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Mon, 24 Feb 2025 15:39:22 +0000 Subject: [PATCH 23/25] Manage api tokens as admin and change time formatting #191 --- src/components/AppHeader.vue | 7 + src/components/news/NewsRenderer.vue | 2 +- .../object-storage/BucketListItem.vue | 4 +- .../LastParameterizationsModal.vue | 6 +- .../{modals => user}/DeleteApiTokenModal.vue | 29 ++- src/components/workflows/WorkflowCard.vue | 4 +- .../workflows/modals/DeleteExecutionModal.vue | 2 +- src/router/adminRoutes.ts | 9 + src/stores/users.ts | 16 +- src/views/DashboardView.vue | 10 + src/views/admin/AdminApiTokensView.vue | 233 ++++++++++++++++++ src/views/admin/AdminBucketsView.vue | 2 +- src/views/admin/AdminResourcesView.vue | 2 +- src/views/admin/AdminUsersView.vue | 2 +- .../admin/AdminWorkflowExecutionView.vue | 8 +- src/views/object-storage/BucketView.vue | 2 +- src/views/user/ListApiTokenView.vue | 6 +- src/views/user/ProfileView.vue | 6 +- .../workflows/ListWorkflowExecutionsView.vue | 8 +- src/views/workflows/ReviewWorkflowsView.vue | 2 +- 20 files changed, 328 insertions(+), 32 deletions(-) rename src/components/{modals => user}/DeleteApiTokenModal.vue (52%) create mode 100644 src/views/admin/AdminApiTokensView.vue diff --git a/src/components/AppHeader.vue b/src/components/AppHeader.vue index 6aaa9ab..cd2864d 100644 --- a/src/components/AppHeader.vue +++ b/src/components/AppHeader.vue @@ -235,6 +235,13 @@ watch( >Users </router-link> </li> + <li> + <router-link + class="dropdown-item" + :to="{ name: 'admin-tokens' }" + >API tokens + </router-link> + </li> <li> <router-link class="dropdown-item" diff --git a/src/components/news/NewsRenderer.vue b/src/components/news/NewsRenderer.vue index dfca0a7..fd5e61e 100644 --- a/src/components/news/NewsRenderer.vue +++ b/src/components/news/NewsRenderer.vue @@ -15,7 +15,7 @@ const nameRepository = useNameStore(); <h2>{{ newsEvent.title }}</h2> <markdown-renderer :markdown="newsEvent.content" /> <p class="text-secondary"> - from {{ dayjs.unix(newsEvent.created_at).format("DD.MM.YYYY HH:mm") }} + from {{ dayjs.unix(newsEvent.created_at).format("MMM DD, YYYY HH:mm") }} <template v-if="newsEvent.creator_id" >by {{ nameRepository.getName(newsEvent.creator_id) }} </template> diff --git a/src/components/object-storage/BucketListItem.vue b/src/components/object-storage/BucketListItem.vue index ffa79c7..0bb4388 100644 --- a/src/components/object-storage/BucketListItem.vue +++ b/src/components/object-storage/BucketListItem.vue @@ -254,7 +254,9 @@ onMounted(() => { :id="'tooltip-creation-date-' + randomIDSuffix" data-bs-toggle="tooltip" :data-bs-title=" - dayjs.unix(bucket.created_at).format('DD.MM.YYYY HH:mm:ss') + dayjs + .unix(bucket.created_at) + .format('MMM DD, YYYY HH:mm:ss') " > {{ dayjs.unix(bucket.created_at).fromNow() }} diff --git a/src/components/parameter-schema/LastParameterizationsModal.vue b/src/components/parameter-schema/LastParameterizationsModal.vue index b93df71..5145c45 100644 --- a/src/components/parameter-schema/LastParameterizationsModal.vue +++ b/src/components/parameter-schema/LastParameterizationsModal.vue @@ -225,7 +225,9 @@ function parentDir(s3Path?: string | null): string | undefined { </td> <td> {{ - dayjs.unix(execution.start_time).format("DD.MM.YYYY HH:mm") + dayjs + .unix(execution.start_time) + .format("MMM DD, YYYY HH:mm") }} </td> <td> @@ -284,7 +286,7 @@ function parentDir(s3Path?: string | null): string | undefined { {{ dayjs .unix(formState.selectedExecution.start_time) - .format("DD.MM.YYYY HH:mm") + .format("MMM DD, YYYY HH:mm") }}</span >: </h5> diff --git a/src/components/modals/DeleteApiTokenModal.vue b/src/components/user/DeleteApiTokenModal.vue similarity index 52% rename from src/components/modals/DeleteApiTokenModal.vue rename to src/components/user/DeleteApiTokenModal.vue index 1d1f4b9..31fca43 100644 --- a/src/components/modals/DeleteApiTokenModal.vue +++ b/src/components/user/DeleteApiTokenModal.vue @@ -1,6 +1,7 @@ <script setup lang="ts"> -import DeleteModal from "./DeleteModal.vue"; +import DeleteModal from "../modals/DeleteModal.vue"; import type { ApiTokenOut } from "@/client/types.gen.ts"; +import dayjs from "dayjs"; const props = defineProps<{ modalId: string; @@ -34,12 +35,30 @@ function deleteToken() { @confirm-delete="deleteToken" > <template #body> - <p> + <div class="mb-3"> Are you sure you want to delete the API token <strong v-if="props.token">{{ props.token.name }}</strong - >?<br /> - You can't access the API with this token anymore. - </p> + >? + <ul v-if="token"> + <li> + Created at: + {{ dayjs.unix(token.created_at).format("MMM DD, YYYY HH:mm:ss") }} + </li> + <li v-if="token.expires_at"> + Expires at: + {{ dayjs.unix(token.expires_at).format("MMM DD, YYYY") }} + </li> + <li> + Last used: + <span v-if="token.last_used">{{ + dayjs.unix(token.last_used).format("MMM DD, YYYY HH:mm:ss") + }}</span + ><span v-else class="fa-italic">Never</span> + </li> + <li>Scopes: {{ token.scopes.join(", ") }}</li> + </ul> + <b>You can't access the API with this token anymore.</b> + </div> </template> </delete-modal> </template> diff --git a/src/components/workflows/WorkflowCard.vue b/src/components/workflows/WorkflowCard.vue index 866b4e0..e82a811 100644 --- a/src/components/workflows/WorkflowCard.vue +++ b/src/components/workflows/WorkflowCard.vue @@ -91,7 +91,9 @@ onMounted(() => { data-bs-toggle="tooltip" class="align-self-end text-secondary" :data-bs-title=" - dayjs.unix(latestVersion?.created_at).format('DD.MM.YYYY HH:mm:ss') + dayjs + .unix(latestVersion?.created_at) + .format('MMM DD, YYYY HH:mm:ss') " > Last Update: {{ dayjs.unix(latestVersion?.created_at).fromNow() }} diff --git a/src/components/workflows/modals/DeleteExecutionModal.vue b/src/components/workflows/modals/DeleteExecutionModal.vue index 2e2791e..5278d85 100644 --- a/src/components/workflows/modals/DeleteExecutionModal.vue +++ b/src/components/workflows/modals/DeleteExecutionModal.vue @@ -57,7 +57,7 @@ function deleteExecution() { {{ dayjs .unix(execution?.start_time ?? 0) - .format("DD.MM.YYYY HH:mm:ss") + .format("MMM DD, YYYY HH:mm:ss") }} </th> </tr> diff --git a/src/router/adminRoutes.ts b/src/router/adminRoutes.ts index 0a16749..13a7c34 100644 --- a/src/router/adminRoutes.ts +++ b/src/router/adminRoutes.ts @@ -28,6 +28,15 @@ export const adminRoutes: RouteRecordRaw[] = [ title: "Manage Buckets", }, }, + { + path: "/admin/tokens", + name: "admin-tokens", + component: () => import("../views/admin/AdminApiTokensView.vue"), + meta: { + requiresAdminRole: true, + title: "Manage Api tokens", + }, + }, { path: "/admin/executions", name: "admin-executions", diff --git a/src/stores/users.ts b/src/stores/users.ts index 7eab462..7005cc5 100644 --- a/src/stores/users.ts +++ b/src/stores/users.ts @@ -138,17 +138,17 @@ export const useUserStore = defineStore("user", { return users; }); }, - fetchApiTokens( - uid?: string, - onFinally?: () => void, - ): Promise<ApiTokenOut[]> { + fetchApiTokens(uid?: string): Promise<ApiTokenOut[]> { + return ApiTokenService.apiTokenListToken({ + query: { uid: uid }, + }).then((response) => response.data!); + }, + + fetchMyApiTokens(onFinally?: () => void) { if (this.apiTokens.length > 0) { onFinally?.(); } - return ApiTokenService.apiTokenListToken({ - query: { uid: uid }, - }) - .then((response) => response.data!) + this.fetchApiTokens(useUserStore().currentUID) .then((tokens) => { for (const token of tokens) { this.apiTokensMapping[token.token_id] = token; diff --git a/src/views/DashboardView.vue b/src/views/DashboardView.vue index e6bb46e..ece8e15 100644 --- a/src/views/DashboardView.vue +++ b/src/views/DashboardView.vue @@ -581,6 +581,16 @@ function accumulateWorkflowStatus( Invite or find users and update their roles </template> </bootstrap-card> + <bootstrap-card class="hover-shadow m-2 flex-fill w-fit"> + <template #title> + <h5> + <router-link :to="{ name: 'admin-tokens' }" + >API tokens</router-link + > + </h5> + </template> + <template #body> Manage all API tokens on the platform </template> + </bootstrap-card> <bootstrap-card class="hover-shadow m-2 flex-fill w-fit"> <template #title> <h5> diff --git a/src/views/admin/AdminApiTokensView.vue b/src/views/admin/AdminApiTokensView.vue new file mode 100644 index 0000000..3fa05c8 --- /dev/null +++ b/src/views/admin/AdminApiTokensView.vue @@ -0,0 +1,233 @@ +<script setup lang="ts"> +import { onBeforeMount, reactive } from "vue"; +import { useRoute, useRouter } from "vue-router"; +import { useNameStore, useUserStore } from "@/stores"; +import type { ApiTokenOut, UserOut } from "@/client"; +import SearchUserModal from "@/components/modals/SearchUserModal.vue"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import dayjs from "dayjs"; +import DeleteApiTokenModal from "@/components/user/DeleteApiTokenModal.vue"; + +const route = useRoute<"admin-tokens">(); +const router = useRouter(); + +const userRepository = useUserStore(); +const nameRepository = useNameStore(); + +const QUERY_PARAM_OWNER_ID = "owner_id"; + +const filters = reactive<{ + ownerId: string; +}>({ + ownerId: "", +}); + +const formState = reactive<{ + searched: boolean; + loading: boolean; + tokens: ApiTokenOut[]; + deleteToken?: ApiTokenOut; +}>({ + searched: false, + loading: false, + tokens: [], + deleteToken: undefined, +}); + +function searchTokens() { + formState.loading = true; + userRepository + .fetchApiTokens(filters.ownerId ? filters.ownerId : undefined) + .then((tokens) => { + formState.tokens = tokens; + userRepository.fetchUsernames(tokens.map((token) => token.uid)); + }) + .finally(() => { + formState.searched = true; + formState.loading = false; + }); + const queryParams: Record<string, string> = {}; + if (filters.ownerId.length > 0) { + queryParams[QUERY_PARAM_OWNER_ID] = filters.ownerId; + } + router.replace({ + name: "admin-tokens", + query: queryParams, + }); +} + +function resetForm() { + filters.ownerId = ""; + formState.tokens = []; + formState.searched = false; + router.replace({ name: "admin-tokens" }); +} + +function updateUser(user: UserOut) { + filters.ownerId = user.uid; +} + +function confirmedDeleteApiToken(tokenId: string) { + formState.loading = true; + formState.deleteToken = undefined; + userRepository + .deleteApiToken(tokenId) + .then(() => { + formState.tokens = formState.tokens.filter( + (token) => token.token_id !== tokenId, + ); + }) + .finally(() => { + formState.loading = false; + }); +} + +onBeforeMount(() => { + let search = false; + if (route.query[QUERY_PARAM_OWNER_ID] != undefined) { + if (typeof route.query[QUERY_PARAM_OWNER_ID] === "string") { + filters.ownerId = route.query[QUERY_PARAM_OWNER_ID]; + userRepository.fetchUsernames([route.query[QUERY_PARAM_OWNER_ID]]); + search = true; + } + } + if (search) { + searchTokens(); + } +}); +</script> + +<template> + <search-user-modal + modal-id="admin-token-search-user-modal" + @user-found="updateUser" + /> + <delete-api-token-modal + modal-id="admin-delete-api-token-modal" + :token="formState.deleteToken" + @confirm-delete="confirmedDeleteApiToken" + /> + <div class="border-bottom mb-4"> + <h2>Manage API tokens</h2> + </div> + <form + id="admin-tokens-search-form" + @submit.prevent="searchTokens" + @reset.prevent="resetForm" + > + <div class="mb-2"> + <label for="admin-tokens-user-search" class="form-label" + >Name of the owner</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-user" /> + </div> + <input + id="admin-token-user-search" + type="text" + class="form-control" + readonly + :value="nameRepository.getName(filters.ownerId)" + placeholder="Search for owner" + data-bs-toggle="modal" + data-bs-target="#admin-token-search-user-modal" + /> + </div> + </div> + <button + type="submit" + class="btn btn-primary w-fit" + :disabled="formState.loading" + > + Search + </button> + <button + type="reset" + class="btn-primary btn w-fit ms-4" + :disabled="formState.loading" + > + Reset + </button> + </form> + <div class="overflow-x-auto" style="max-width: 100vw"> + <table class="table table-striped align-middle"> + <thead> + <tr> + <th scope="col"><b>Name</b></th> + <th scope="col">ID</th> + <th scope="col">Owner</th> + <th scope="col">Created at</th> + <th scope="col">Last used</th> + <th scope="col">Expires at</th> + <th scope="col">Scope READ</th> + <th scope="col">Scope WRITE</th> + <th></th> + </tr> + </thead> + <tbody v-if="formState.tokens.length === 0"> + <tr> + <td colspan="9" class="text-center fst-italic fw-light"> + <template v-if="formState.searched" + >No API tokens found with specified filters + </template> + <template v-else + >Select a filter and search for API tokens + </template> + </td> + </tr> + </tbody> + <tbody v-else> + <tr v-for="token in formState.tokens" :key="token.token_id"> + <th scope="row">{{ token.name }}</th> + <td>{{ token.token_id }}</td> + <td>{{ nameRepository.getName(token.uid) }}</td> + <td> + {{ dayjs.unix(token.created_at).format("MMM DD, YYYY HH:mm:ss") }} + </td> + <td> + <span v-if="token.last_used">{{ + dayjs.unix(token.last_used).format("MMM DD, YYYY HH:mm:ss") + }}</span + ><span v-else class="fa-italic">Never</span> + </td> + <td> + <span v-if="token.expires_at">{{ + dayjs.unix(token.expires_at).format("MMM DD, YYYY") + }}</span + ><span v-else class="fa-italic">Never</span> + </td> + <td class="text-center"> + <input + type="checkbox" + class="form-check-input" + :checked="token.scopes.includes('read')" + disabled + /> + </td> + <td class="text-center"> + <input + type="checkbox" + class="form-check-input" + :checked="token.scopes.includes('write')" + disabled + /> + </td> + <td> + <button + type="button" + class="btn btn-danger" + data-bs-toggle="modal" + data-bs-target="#admin-delete-api-token-modal" + @click="formState.deleteToken = token" + > + Delete + </button> + </td> + </tr> + </tbody> + </table> + </div> +</template> + +<style scoped></style> diff --git a/src/views/admin/AdminBucketsView.vue b/src/views/admin/AdminBucketsView.vue index 86ef666..6da1a2e 100644 --- a/src/views/admin/AdminBucketsView.vue +++ b/src/views/admin/AdminBucketsView.vue @@ -263,7 +263,7 @@ onBeforeMount(() => { <th scope="row">{{ bucket.name }}</th> <td class="description-column">{{ bucket.description }}</td> <td> - {{ dayjs.unix(bucket.created_at).format("DD.MM.YYYY HH:mm:ss") }} + {{ dayjs.unix(bucket.created_at).format("MMM DD, YYYY HH:mm:ss") }} </td> <td> <span v-if="bucket.size_limit"> diff --git a/src/views/admin/AdminResourcesView.vue b/src/views/admin/AdminResourcesView.vue index 06a2ad6..5e5033c 100644 --- a/src/views/admin/AdminResourcesView.vue +++ b/src/views/admin/AdminResourcesView.vue @@ -405,7 +405,7 @@ onBeforeMount(() => { {{ dayjs .unix(version.created_at) - .format("DD.MM.YYYY HH:mm:ss") + .format("MMM DD, YYYY HH:mm:ss") }} </th> <th>{{ version.status }}</th> diff --git a/src/views/admin/AdminUsersView.vue b/src/views/admin/AdminUsersView.vue index ed5822f..83e47dd 100644 --- a/src/views/admin/AdminUsersView.vue +++ b/src/views/admin/AdminUsersView.vue @@ -317,7 +317,7 @@ onBeforeMount(() => { </td> <td> <span v-if="user.last_login">{{ - dayjs.unix(user.last_login).fromNow() + dayjs.unix(user.last_login).format("MMM DD, YYYY HH:mm") }}</span> </td> <td> diff --git a/src/views/admin/AdminWorkflowExecutionView.vue b/src/views/admin/AdminWorkflowExecutionView.vue index 7c0f17d..b216a60 100644 --- a/src/views/admin/AdminWorkflowExecutionView.vue +++ b/src/views/admin/AdminWorkflowExecutionView.vue @@ -540,7 +540,9 @@ onMounted(() => { > </td> <td> - {{ dayjs.unix(execution.start_time).format("DD.MM.YYYY HH:mm") }} + {{ + dayjs.unix(execution.start_time).format("MMM DD, YYYY HH:mm") + }} </td> <td> <template v-if="execution.end_time"> @@ -559,7 +561,9 @@ onMounted(() => { </td> <td> <template v-if="execution.end_time"> - {{ dayjs.unix(execution.end_time).format("DD.MM.YYYY HH:mm") }} + {{ + dayjs.unix(execution.end_time).format("MMM DD, YYYY HH:mm") + }} </template> <template v-else> -</template> </td> diff --git a/src/views/object-storage/BucketView.vue b/src/views/object-storage/BucketView.vue index aa4f08f..468dc32 100644 --- a/src/views/object-storage/BucketView.vue +++ b/src/views/object-storage/BucketView.vue @@ -809,7 +809,7 @@ function clickBox() { class="date-tooltip" data-bs-toggle="tooltip" :data-bs-title=" - dayjs(obj.LastModified).format('DD.MM.YYYY HH:mm:ss') + dayjs(obj.LastModified).format('MMM DD, YYYY HH:mm:ss') " >{{ dayjs(obj.LastModified).fromNow() }}</span > diff --git a/src/views/user/ListApiTokenView.vue b/src/views/user/ListApiTokenView.vue index 87e69e2..2c59182 100644 --- a/src/views/user/ListApiTokenView.vue +++ b/src/views/user/ListApiTokenView.vue @@ -7,7 +7,7 @@ import type { ApiTokenPrivateOut } from "@/client/types.gen"; import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; import CopyToClipboardIcon from "@/components/CopyToClipboardIcon.vue"; import { environment } from "@/environment"; -import DeleteApiTokenModal from "@/components/modals/DeleteApiTokenModal.vue"; +import DeleteApiTokenModal from "@/components/user/DeleteApiTokenModal.vue"; const userRepository = useUserStore(); @@ -25,7 +25,7 @@ const state = reactive<{ function fetchTokens() { state.loading = true; - userRepository.fetchApiTokens(userRepository.currentUID, () => { + userRepository.fetchMyApiTokens(() => { state.loading = false; }); } @@ -170,7 +170,7 @@ onMounted(() => { {{ dayjs.unix(token.created_at).format("MMM DD, YYYY") }} </td> <td v-if="token.last_used"> - {{ dayjs.unix(token.last_used).format("MMM DD, YYYY HH:mm") }} + {{ dayjs.unix(token.last_used).format("MMM DD, YYYY HH:mm:ss") }} </td> <td v-else>Never</td> <td v-if="token.expires_at"> diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue index 2b07838..cec61e0 100644 --- a/src/views/user/ProfileView.vue +++ b/src/views/user/ProfileView.vue @@ -93,7 +93,11 @@ onMounted(() => { CloWM ID: {{ userRepository.currentUID }}<br /> <span v-if="userRepository.user?.last_login" >Last Login: - {{ dayjs.unix(userRepository.user?.last_login).fromNow() }}</span + {{ + dayjs + .unix(userRepository.user?.last_login) + .format("MMM DD, YYYY HH:mm") + }}</span > </div> </div> diff --git a/src/views/workflows/ListWorkflowExecutionsView.vue b/src/views/workflows/ListWorkflowExecutionsView.vue index 0c6d234..314f8dc 100644 --- a/src/views/workflows/ListWorkflowExecutionsView.vue +++ b/src/views/workflows/ListWorkflowExecutionsView.vue @@ -258,7 +258,9 @@ onUnmounted(() => { > </td> <td> - {{ dayjs.unix(execution.start_time).format("DD.MM.YYYY HH:mm") }} + {{ + dayjs.unix(execution.start_time).format("MMM DD, YYYY HH:mm") + }} </td> <td> <template v-if="execution.end_time"> @@ -277,7 +279,9 @@ onUnmounted(() => { </td> <td> <template v-if="execution.end_time"> - {{ dayjs.unix(execution.end_time).format("DD.MM.YYYY HH:mm") }} + {{ + dayjs.unix(execution.end_time).format("MMM DD, YYYY HH:mm") + }} </template> <template v-else> -</template> </td> diff --git a/src/views/workflows/ReviewWorkflowsView.vue b/src/views/workflows/ReviewWorkflowsView.vue index 7c8eb5c..c031ca2 100644 --- a/src/views/workflows/ReviewWorkflowsView.vue +++ b/src/views/workflows/ReviewWorkflowsView.vue @@ -124,7 +124,7 @@ onMounted(() => { :data-bs-title=" dayjs .unix(version?.created_at) - .format('DD.MM.YYYY HH:mm:ss') + .format('MMM DD, YYYY HH:mm:ss') " >{{ dayjs.unix(version.created_at).fromNow() }}</span > -- GitLab From 3303522eb93bd161b9b87f847e4e7562a5079bf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Tue, 25 Feb 2025 16:04:56 +0000 Subject: [PATCH 24/25] Edit welcome modal #191 --- package-lock.json | 392 +++++++++--------- package.json | 2 +- src/App.vue | 63 ++- src/views/DashboardView.vue | 47 ++- src/views/SignupView.vue | 4 +- src/views/admin/AdminUsersView.vue | 10 + src/views/user/ProfileView.vue | 3 +- .../workflows/ListWorkflowExecutionsView.vue | 12 +- 8 files changed, 326 insertions(+), 207 deletions(-) diff --git a/package-lock.json b/package-lock.json index e8c29ec..0d0813f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,7 +55,7 @@ "prettier": "~3.5.0", "sass": "^1.66.0", "typescript": "~5.7.0", - "vite": "~6.1.0", + "vite": "~6.2.0", "vite-plugin-node-polyfills": "^0.23.0", "vite-plugin-vue-devtools": "^7.7.0", "vue-tsc": "~2.2.0" @@ -1539,9 +1539,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", "cpu": [ "ppc64" ], @@ -1556,9 +1556,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", "cpu": [ "arm" ], @@ -1573,9 +1573,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", "cpu": [ "arm64" ], @@ -1590,9 +1590,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", "cpu": [ "x64" ], @@ -1607,9 +1607,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", "cpu": [ "arm64" ], @@ -1624,9 +1624,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", "cpu": [ "x64" ], @@ -1641,9 +1641,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", "cpu": [ "arm64" ], @@ -1658,9 +1658,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", "cpu": [ "x64" ], @@ -1675,9 +1675,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", "cpu": [ "arm" ], @@ -1692,9 +1692,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", "cpu": [ "arm64" ], @@ -1709,9 +1709,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", "cpu": [ "ia32" ], @@ -1726,9 +1726,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", "cpu": [ "loong64" ], @@ -1743,9 +1743,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", "cpu": [ "mips64el" ], @@ -1760,9 +1760,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", "cpu": [ "ppc64" ], @@ -1777,9 +1777,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", "cpu": [ "riscv64" ], @@ -1794,9 +1794,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", "cpu": [ "s390x" ], @@ -1811,9 +1811,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", "cpu": [ "x64" ], @@ -1828,9 +1828,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", "cpu": [ "arm64" ], @@ -1845,9 +1845,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", "cpu": [ "x64" ], @@ -1862,9 +1862,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", "cpu": [ "arm64" ], @@ -1879,9 +1879,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", "cpu": [ "x64" ], @@ -1896,9 +1896,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", "cpu": [ "x64" ], @@ -1913,9 +1913,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", "cpu": [ "arm64" ], @@ -1930,9 +1930,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", "cpu": [ "ia32" ], @@ -1947,9 +1947,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", "cpu": [ "x64" ], @@ -3148,9 +3148,9 @@ } }, "node_modules/@smithy/core": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.1.4.tgz", - "integrity": "sha512-wFExFGK+7r2wYriOqe7RRIBNpvxwiS95ih09+GSLRBdoyK/O1uZA7K7pKesj5CBvwJuSBeXwLyR88WwIAY+DGA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.1.5.tgz", + "integrity": "sha512-HLclGWPkCsekQgsyzxLhCQLa8THWXtB5PxyYN+2O6nkyLt550KQKTlbV2D1/j5dNIQapAZM1+qFnpBFxZQkgCA==", "license": "Apache-2.0", "dependencies": { "@smithy/middleware-serde": "^4.0.2", @@ -3158,7 +3158,7 @@ "@smithy/types": "^4.1.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-middleware": "^4.0.1", - "@smithy/util-stream": "^4.1.1", + "@smithy/util-stream": "^4.1.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -3366,12 +3366,12 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.5.tgz", - "integrity": "sha512-cPzGZV7qStHwboFrm6GfrzQE+YDiCzWcTh4+7wKrP/ZQ4gkw+r7qDjV8GjM4N0UYsuUyLfpzLGg5hxsYTU11WA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.6.tgz", + "integrity": "sha512-ftpmkTHIFqgaFugcjzLZv3kzPEFsBFSnq1JsIkr2mwFzCraZVhQk2gqN51OOeRxqhbPTkRFj39Qd2V91E/mQxg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.1.4", + "@smithy/core": "^3.1.5", "@smithy/middleware-serde": "^4.0.2", "@smithy/node-config-provider": "^4.0.1", "@smithy/shared-ini-file-loader": "^4.0.1", @@ -3385,15 +3385,15 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.6.tgz", - "integrity": "sha512-s8QzuOQnbdvRymD9Gt9c9zMq10wUQAHQ3z72uirrBHCwZcLTrL5iCOuVTMdka2IXOYhQE890WD5t6G24+F+Qcg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.7.tgz", + "integrity": "sha512-58j9XbUPLkqAcV1kHzVX/kAR16GT+j7DUZJqwzsxh1jtz7G82caZiGyyFgUvogVfNTg3TeAOIJepGc8TXF4AVQ==", "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^4.0.1", "@smithy/protocol-http": "^5.0.1", "@smithy/service-error-classification": "^4.0.1", - "@smithy/smithy-client": "^4.1.5", + "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", "@smithy/util-middleware": "^4.0.1", "@smithy/util-retry": "^4.0.1", @@ -3446,9 +3446,9 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.2.tgz", - "integrity": "sha512-X66H9aah9hisLLSnGuzRYba6vckuFtGE+a5DcHLliI/YlqKrGoxhisD5XbX44KyoeRzoNlGr94eTsMVHFAzPOw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.3.tgz", + "integrity": "sha512-dYCLeINNbYdvmMLtW0VdhW1biXt+PPCGazzT5ZjKw46mOtdgToQEwjqZSS9/EN8+tNs/RO0cEWG044+YZs97aA==", "license": "Apache-2.0", "dependencies": { "@smithy/abort-controller": "^4.0.1", @@ -3559,17 +3559,17 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.5.tgz", - "integrity": "sha512-DMXYoYeL4QkElr216n1yodTFeATbfb4jwYM9gKn71Rw/FNA1/Sm36tkTSCsZEs7mgpG3OINmkxL9vgVFzyGPaw==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.6.tgz", + "integrity": "sha512-UYDolNg6h2O0L+cJjtgSyKKvEKCOa/8FHYJnBobyeoeWDmNpXjwOAtw16ezyeu1ETuuLEOZbrynK0ZY1Lx9Jbw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.1.4", - "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/core": "^3.1.5", + "@smithy/middleware-endpoint": "^4.0.6", "@smithy/middleware-stack": "^4.0.1", "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", - "@smithy/util-stream": "^4.1.1", + "@smithy/util-stream": "^4.1.2", "tslib": "^2.6.2" }, "engines": { @@ -3666,13 +3666,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.6.tgz", - "integrity": "sha512-N8+VCt+piupH1A7DgSVDNrVHqRLz8r6DvBkpS7EWHiIxsUk4jqGuQLjqC/gnCzmwGkVBdNruHoYAzzaSQ8e80w==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.7.tgz", + "integrity": "sha512-CZgDDrYHLv0RUElOsmZtAnp1pIjwDVCSuZWOPhIOBvG36RDfX1Q9+6lS61xBf+qqvHoqRjHxgINeQz47cYFC2Q==", "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^4.0.1", - "@smithy/smithy-client": "^4.1.5", + "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", "bowser": "^2.11.0", "tslib": "^2.6.2" @@ -3682,16 +3682,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.6.tgz", - "integrity": "sha512-9zhx1shd1VwSSVvLZB8CM3qQ3RPD3le7A3h/UPuyh/PC7g4OaWDi2xUNzamsVoSmCGtmUBONl56lM2EU6LcH7A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.7.tgz", + "integrity": "sha512-79fQW3hnfCdrfIi1soPbK3zmooRFnLpSx3Vxi6nUlqaaQeC5dm8plt4OTNDNqEEEDkvKghZSaoti684dQFVrGQ==", "license": "Apache-2.0", "dependencies": { "@smithy/config-resolver": "^4.0.1", "@smithy/credential-provider-imds": "^4.0.1", "@smithy/node-config-provider": "^4.0.1", "@smithy/property-provider": "^4.0.1", - "@smithy/smithy-client": "^4.1.5", + "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, @@ -3753,13 +3753,13 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.1.1.tgz", - "integrity": "sha512-+Xvh8nhy0Wjv1y71rBVyV3eJU3356XsFQNI8dEZVNrQju7Eib8G31GWtO+zMa9kTCGd41Mflu+ZKfmQL/o2XzQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.1.2.tgz", + "integrity": "sha512-44PKEqQ303d3rlQuiDpcCcu//hV8sn+u2JBo84dWCE0rvgeiVl0IlLMagbU++o0jCWhYCsHaAt9wZuZqNe05Hw==", "license": "Apache-2.0", "dependencies": { "@smithy/fetch-http-handler": "^5.0.1", - "@smithy/node-http-handler": "^4.0.2", + "@smithy/node-http-handler": "^4.0.3", "@smithy/types": "^4.1.0", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", @@ -3903,17 +3903,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz", - "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.25.0.tgz", + "integrity": "sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/type-utils": "8.24.1", - "@typescript-eslint/utils": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", + "@typescript-eslint/scope-manager": "8.25.0", + "@typescript-eslint/type-utils": "8.25.0", + "@typescript-eslint/utils": "8.25.0", + "@typescript-eslint/visitor-keys": "8.25.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -3933,16 +3933,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz", - "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.25.0.tgz", + "integrity": "sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/typescript-estree": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", + "@typescript-eslint/scope-manager": "8.25.0", + "@typescript-eslint/types": "8.25.0", + "@typescript-eslint/typescript-estree": "8.25.0", + "@typescript-eslint/visitor-keys": "8.25.0", "debug": "^4.3.4" }, "engines": { @@ -3958,14 +3958,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz", - "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.25.0.tgz", + "integrity": "sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1" + "@typescript-eslint/types": "8.25.0", + "@typescript-eslint/visitor-keys": "8.25.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3976,14 +3976,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz", - "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.25.0.tgz", + "integrity": "sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.24.1", - "@typescript-eslint/utils": "8.24.1", + "@typescript-eslint/typescript-estree": "8.25.0", + "@typescript-eslint/utils": "8.25.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, @@ -4000,9 +4000,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz", - "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.25.0.tgz", + "integrity": "sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==", "dev": true, "license": "MIT", "engines": { @@ -4014,14 +4014,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz", - "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.25.0.tgz", + "integrity": "sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", + "@typescript-eslint/types": "8.25.0", + "@typescript-eslint/visitor-keys": "8.25.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -4041,16 +4041,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz", - "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.25.0.tgz", + "integrity": "sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/typescript-estree": "8.24.1" + "@typescript-eslint/scope-manager": "8.25.0", + "@typescript-eslint/types": "8.25.0", + "@typescript-eslint/typescript-estree": "8.25.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4065,13 +4065,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz", - "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.25.0.tgz", + "integrity": "sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/types": "8.25.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -5573,9 +5573,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.103", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.103.tgz", - "integrity": "sha512-P6+XzIkfndgsrjROJWfSvVEgNHtPgbhVyTkwLjUM2HU/h7pZRORgaTlHqfAikqxKmdJMLW8fftrdGWbd/Ds0FA==", + "version": "1.5.104", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.104.tgz", + "integrity": "sha512-Us9M2L4cO/zMBqVkJtnj353nQhMju9slHm62NprKTmdF3HH8wYOtNvDFq/JB2+ZRoGLzdvYDiATlMHs98XBM1g==", "dev": true, "license": "ISC" }, @@ -5671,9 +5671,9 @@ } }, "node_modules/esbuild": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -5684,31 +5684,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" + "@esbuild/aix-ppc64": "0.25.0", + "@esbuild/android-arm": "0.25.0", + "@esbuild/android-arm64": "0.25.0", + "@esbuild/android-x64": "0.25.0", + "@esbuild/darwin-arm64": "0.25.0", + "@esbuild/darwin-x64": "0.25.0", + "@esbuild/freebsd-arm64": "0.25.0", + "@esbuild/freebsd-x64": "0.25.0", + "@esbuild/linux-arm": "0.25.0", + "@esbuild/linux-arm64": "0.25.0", + "@esbuild/linux-ia32": "0.25.0", + "@esbuild/linux-loong64": "0.25.0", + "@esbuild/linux-mips64el": "0.25.0", + "@esbuild/linux-ppc64": "0.25.0", + "@esbuild/linux-riscv64": "0.25.0", + "@esbuild/linux-s390x": "0.25.0", + "@esbuild/linux-x64": "0.25.0", + "@esbuild/netbsd-arm64": "0.25.0", + "@esbuild/netbsd-x64": "0.25.0", + "@esbuild/openbsd-arm64": "0.25.0", + "@esbuild/openbsd-x64": "0.25.0", + "@esbuild/sunos-x64": "0.25.0", + "@esbuild/win32-arm64": "0.25.0", + "@esbuild/win32-ia32": "0.25.0", + "@esbuild/win32-x64": "0.25.0" } }, "node_modules/escalade": { @@ -8462,9 +8462,9 @@ } }, "node_modules/sass": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", - "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.1.tgz", + "integrity": "sha512-Uk8WpxM5v+0cMR0XjX9KfRIacmSG86RH4DCCZjLU2rFh5tyutt9siAXJ7G+YfxQ99Q6wrRMbMlVl6KqUms71ag==", "dev": true, "license": "MIT", "dependencies": { @@ -8974,15 +8974,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.1.tgz", - "integrity": "sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.25.0.tgz", + "integrity": "sha512-TxRdQQLH4g7JkoFlYG3caW5v1S6kEkz8rqt80iQJZUYPq1zD1Ra7HfQBJJ88ABRaMvHAXnwRvRB4V+6sQ9xN5Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.24.1", - "@typescript-eslint/parser": "8.24.1", - "@typescript-eslint/utils": "8.24.1" + "@typescript-eslint/eslint-plugin": "8.25.0", + "@typescript-eslint/parser": "8.25.0", + "@typescript-eslint/utils": "8.25.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9146,14 +9146,14 @@ } }, "node_modules/vite": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.1.tgz", - "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.0.tgz", + "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.24.2", - "postcss": "^8.5.2", + "esbuild": "^0.25.0", + "postcss": "^8.5.3", "rollup": "^4.30.1" }, "bin": { diff --git a/package.json b/package.json index 3c83d6a..21e9d7c 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "prettier": "~3.5.0", "sass": "^1.66.0", "typescript": "~5.7.0", - "vite": "~6.1.0", + "vite": "~6.2.0", "vite-plugin-node-polyfills": "^0.23.0", "vue-tsc": "~2.2.0", "vite-plugin-vue-devtools": "^7.7.0" diff --git a/src/App.vue b/src/App.vue index 5e39972..be09bc6 100644 --- a/src/App.vue +++ b/src/App.vue @@ -161,6 +161,7 @@ onBeforeMount(() => { otrRepository.fetchOwnOtrs(OwnershipTypeEnum.BUCKET); executionRepository.fetchExecutions(); newsStore.fetchCurrentNews(); + userRepository.fetchMyApiTokens(); if (!userRepository.foreignUser) { bucketRepository.fetchOwnPermissions(); } @@ -182,6 +183,10 @@ onBeforeMount(() => { } }); +function navigateToPage(name: string) { + router.push({ name: name }); +} + onMounted(() => { if (firstLogin.value && userRepository.authenticated) { Modal.getOrCreateInstance("#welcome-modal")?.show(); @@ -199,8 +204,62 @@ onMounted(() => { static-backdrop size-modifier-modal="xl" > - <template #header>Welcome to CloWM</template> - <template #body>This is your first time in CloWM</template> + <template #header + ><h3 class="mb-0">Welcome to CloWM - What to do next?</h3></template + > + <template #body> + <h4> + 1. + <router-link + :to="{ name: 'profile' }" + data-bs-dismiss="modal" + @click.prevent="navigateToPage('profile')" + >My Profile + </router-link> + </h4> + <p> + You can connect your newly created CloWM account with another identity + provider. + </p> + <h4> + 2. + <router-link + :to="{ name: 'buckets' }" + data-bs-dismiss="modal" + @click.prevent="navigateToPage('buckets')" + >Data Buckets + </router-link> + </h4> + <p> + Up- and download data to your personal data buckets. You can use our + <router-link + :to="{ name: 'buckets' }" + data-bs-dismiss="modal" + @click.prevent="navigateToPage('buckets')" + >bucket browser + </router-link> + or use your own tool with your personal + <router-link + :to="{ name: 's3_keys' }" + data-bs-dismiss="modal" + @click.prevent="navigateToPage('s3_keys')" + >S3 credentials. + </router-link> + </p> + <h4> + 3. + <router-link + :to="{ name: 'workflows' }" + data-bs-dismiss="modal" + @click.prevent="navigateToPage('workflows')" + >Workflows + </router-link> + </h4> + <p> + Select one of the {{ workflowRepository.workflows.length }} workflows + and start an workflow execution + </p> + </template> </bootstrap-modal> <router-view /> </div> diff --git a/src/views/DashboardView.vue b/src/views/DashboardView.vue index ece8e15..3247153 100644 --- a/src/views/DashboardView.vue +++ b/src/views/DashboardView.vue @@ -114,6 +114,13 @@ const pendingWorkflowReviews = computed<number>(() => ), ); +const activeTokens = computed<number>(() => { + const time = dayjs().unix(); + return authStore.apiTokens.filter((token) => { + return (token.expires_at ?? time + 1000) > time; + }).length; +}); + function accumulateResourceStatus( resources: ResourceOut[], status: ResourceVersionStatus, @@ -553,6 +560,40 @@ function accumulateWorkflowStatus( </bootstrap-card> </div> </template> + <h3> + <font-awesome-icon icon="fa-solid fa-user" class="me-2" /> + Account Management + </h3> + <div class="d-flex flex-wrap align-items-center"> + <bootstrap-card class="hover-shadow m-2 flex-fill"> + <template #title> + <h5> + <router-link :to="{ name: 'profile' }">My Profile</router-link> + </h5> + </template> + <template #body> + View your profile and connect it with other login providers + </template> + </bootstrap-card> + <bootstrap-card class="hover-shadow m-2 flex-fill"> + <template #title> + <h5> + <router-link :to="{ name: 'api-tokens' }" + >My personal API tokens + </router-link> + </h5> + </template> + <template #body> + {{ authStore.apiTokens.length }} access token + <ul> + <li>{{ activeTokens }} active tokens</li> + <li> + {{ authStore.apiTokens.length - activeTokens }} expired tokens + </li> + </ul> + </template> + </bootstrap-card> + </div> <template v-if="authStore.admin"> <h3> <font-awesome-icon icon="fa-solid fa-user-gear" class="me-2" /> @@ -585,11 +626,11 @@ function accumulateWorkflowStatus( <template #title> <h5> <router-link :to="{ name: 'admin-tokens' }" - >API tokens</router-link - > + >API tokens + </router-link> </h5> </template> - <template #body> Manage all API tokens on the platform </template> + <template #body> Manage all API tokens on the platform</template> </bootstrap-card> <bootstrap-card class="hover-shadow m-2 flex-fill w-fit"> <template #title> diff --git a/src/views/SignupView.vue b/src/views/SignupView.vue index f57cc22..5fb0a8a 100644 --- a/src/views/SignupView.vue +++ b/src/views/SignupView.vue @@ -53,8 +53,8 @@ onBeforeUnmount(() => { The NFDI AAI maintains a list of <a href="https://doc.nfdi-aai.de/community-aai-software/" >connected Community AAIs</a - >. If you have an account at one of those AAIs, you can simply use the NFDI - AII + >. If you have an account at one of those identity providers, you can simply + use the NFDI AAI. </p> <h4>I already have such an account</h4> <p class="fs-6"> diff --git a/src/views/admin/AdminUsersView.vue b/src/views/admin/AdminUsersView.vue index 83e47dd..d6e2377 100644 --- a/src/views/admin/AdminUsersView.vue +++ b/src/views/admin/AdminUsersView.vue @@ -421,6 +421,16 @@ onBeforeMount(() => { >View Workflow executions </router-link> </li> + <li> + <router-link + :to="{ + name: 'admin-tokens', + query: { owner_id: user.uid }, + }" + class="dropdown-item" + >View API tokens + </router-link> + </li> <li v-if=" user.roles.includes(RoleEnum.DB_MAINTAINER) || diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue index cec61e0..404de77 100644 --- a/src/views/user/ProfileView.vue +++ b/src/views/user/ProfileView.vue @@ -150,8 +150,7 @@ onMounted(() => { the National Research Data Infrastructure (NFDI). </p> <div v-if="userRepository.user?.nfdi_id"> - <b>Linked account: </b - >{{ userRepository.user?.nfdi_id }}​@lifescience.eu + <b>Linked account: </b>{{ userRepository.user?.nfdi_id }} </div> <div v-else> <div>Link your account with NFDI AAI</div> diff --git a/src/views/workflows/ListWorkflowExecutionsView.vue b/src/views/workflows/ListWorkflowExecutionsView.vue index 314f8dc..08b76aa 100644 --- a/src/views/workflows/ListWorkflowExecutionsView.vue +++ b/src/views/workflows/ListWorkflowExecutionsView.vue @@ -173,7 +173,17 @@ onUnmounted(() => { {{ executionRepository.executions.length }} - Workflow Execution + workflow execution(s) worth + {{ + executionRepository.executions + .reduce( + (acc, cur) => acc.add(dayjs.duration(cur.cpu_time)), + dayjs.duration(0, "day"), + ) + .asHours() + .toFixed(2) + }} + CPU hours </caption> <thead> <tr> -- GitLab From e9ade5b9bde3a3933b9c493434c11485b87b2a7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Wed, 26 Feb 2025 10:06:10 +0000 Subject: [PATCH 25/25] Edit welcome modal #191 --- src/App.vue | 17 ++++++++++++----- src/views/DashboardView.vue | 6 +++--- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/App.vue b/src/App.vue index be09bc6..f6934c7 100644 --- a/src/App.vue +++ b/src/App.vue @@ -218,8 +218,9 @@ onMounted(() => { </router-link> </h4> <p> - You can connect your newly created CloWM account with another identity - provider. + View your profile. You can see your permissions in the system and ask + for additional ones if you need them. Also, you can connect your newly + created CloWM account with another identity provider. </p> <h4> 2. @@ -252,12 +253,18 @@ onMounted(() => { :to="{ name: 'workflows' }" data-bs-dismiss="modal" @click.prevent="navigateToPage('workflows')" - >Workflows + >Available Workflows </router-link> </h4> <p> - Select one of the {{ workflowRepository.workflows.length }} workflows - and start an workflow execution + Browse through our {{ workflowRepository.workflows.length }} available + workflows. You can select one and just try it out. + </p> + <p> + If you have any questions about CloWM, you can contact our support at + <a href="mailto:support@clowm.bi.denbi.de" + >support@clowm.bi.denbi.de</a + >. </p> </template> </bootstrap-modal> diff --git a/src/views/DashboardView.vue b/src/views/DashboardView.vue index 3247153..7c4cec0 100644 --- a/src/views/DashboardView.vue +++ b/src/views/DashboardView.vue @@ -584,11 +584,11 @@ function accumulateWorkflowStatus( </h5> </template> <template #body> - {{ authStore.apiTokens.length }} access token + {{ authStore.apiTokens.length }} access token(s) <ul> - <li>{{ activeTokens }} active tokens</li> + <li>{{ activeTokens }} active token(s)</li> <li> - {{ authStore.apiTokens.length - activeTokens }} expired tokens + {{ authStore.apiTokens.length - activeTokens }} expired token(s) </li> </ul> </template> -- GitLab