diff --git a/.semgrepignore b/.semgrepignore index 18621cb29..234b60e18 100644 --- a/.semgrepignore +++ b/.semgrepignore @@ -30,4 +30,6 @@ tests/ .vscode/ *.code-workspace *~ -.eslintcache \ No newline at end of file +.eslintcache + +consoleApi.ts \ No newline at end of file diff --git a/Makefile b/Makefile index cb545fa70..5c5d71dd4 100644 --- a/Makefile +++ b/Makefile @@ -53,6 +53,8 @@ clean-swagger: swagger-console: @echo "Generating swagger server code from yaml" @swagger generate server -A console --main-package=management --server-package=restapi --exclude-main -P models.Principal -f ./swagger.yml -r NOTICE + @echo "Generating typescript api" + @npx swagger-typescript-api -p ./swagger.yml -o ./portal-ui/src/api -n consoleApi.ts assets: diff --git a/portal-ui/src/api/consoleApi.ts b/portal-ui/src/api/consoleApi.ts new file mode 100644 index 000000000..b83988720 --- /dev/null +++ b/portal-ui/src/api/consoleApi.ts @@ -0,0 +1,5138 @@ +/* eslint-disable */ +/* tslint:disable */ +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +export interface AccountChangePasswordRequest { + current_secret_key: string; + new_secret_key: string; +} + +export interface ChangeUserPasswordRequest { + selectedUser: string; + newSecretKey: string; +} + +/** @default "sse-s3" */ +export enum BucketEncryptionType { + SseS3 = "sse-s3", + SseKms = "sse-kms", +} + +/** @default "PRIVATE" */ +export enum BucketAccess { + PRIVATE = "PRIVATE", + PUBLIC = "PUBLIC", + CUSTOM = "CUSTOM", +} + +export interface UserServiceAccountItem { + userName?: string; + /** @format int64 */ + numSAs?: number; +} + +export interface Bucket { + /** @minLength 3 */ + name: string; + /** @format int64 */ + size?: number; + access?: BucketAccess; + definition?: string; + rw_access?: { + write?: boolean; + read?: boolean; + }; + /** @format int64 */ + objects?: number; + details?: { + versioning?: boolean; + versioningSuspended?: boolean; + locking?: boolean; + replication?: boolean; + tags?: Record; + quota?: { + /** @format int64 */ + quota?: number; + type?: "hard"; + }; + }; + creation_date?: string; +} + +export interface BucketEncryptionRequest { + encType?: BucketEncryptionType; + kmsKeyID?: string; +} + +export interface BucketEncryptionInfo { + kmsMasterKeyID?: string; + algorithm?: string; +} + +export interface ListBucketsResponse { + /** list of resulting buckets */ + buckets?: Bucket[]; + /** + * number of buckets accessible to the user + * @format int64 + */ + total?: number; +} + +export interface UserServiceAccountSummary { + /** list of users with number of service accounts */ + userServiceAccountList?: UserServiceAccountItem[]; + hasSA?: boolean; +} + +export interface ListObjectsResponse { + /** list of resulting objects */ + objects?: BucketObject[]; + /** + * number of objects + * @format int64 + */ + total?: number; +} + +export interface BucketObject { + name?: string; + /** @format int64 */ + size?: number; + content_type?: string; + last_modified?: string; + is_latest?: boolean; + is_delete_marker?: boolean; + version_id?: string; + user_tags?: Record; + expiration?: string; + expiration_rule_id?: string; + legal_hold_status?: string; + retention_mode?: string; + retention_until_date?: string; + etag?: string; + tags?: Record; + metadata?: Record; + user_metadata?: Record; +} + +export interface MakeBucketRequest { + name: string; + locking?: boolean; + versioning?: boolean; + quota?: SetBucketQuota; + retention?: PutBucketRetentionRequest; +} + +export interface Error { + /** @format int32 */ + code?: number; + message: string; + detailedMessage: string; +} + +export interface User { + accessKey?: string; + policy?: string[]; + memberOf?: string[]; + status?: string; + hasPolicy?: boolean; +} + +export interface ListUsersResponse { + /** list of resulting users */ + users?: User[]; +} + +export interface AddUserRequest { + accessKey: string; + secretKey: string; + groups: string[]; + policies: string[]; +} + +export interface Group { + name?: string; + status?: string; + members?: string[]; + policy?: string; +} + +export interface AddGroupRequest { + group: string; + members: string[]; +} + +export interface ListGroupsResponse { + /** list of groups */ + groups?: string[]; + /** + * total number of groups + * @format int64 + */ + total?: number; +} + +export interface Policy { + name?: string; + policy?: string; +} + +/** @default "user" */ +export enum PolicyEntity { + User = "user", + Group = "group", +} + +export interface SetPolicyRequest { + entityType: PolicyEntity; + entityName: string; +} + +export interface SetPolicyNameRequest { + name: string[]; + entityType: PolicyEntity; + entityName: string; +} + +export interface SetPolicyMultipleNameRequest { + name?: string[]; + users?: IamEntity[]; + groups?: IamEntity[]; +} + +/** @pattern ^[\w+=,.@-]{1,64}$ */ +export type IamEntity = string; + +export interface AddPolicyRequest { + name: string; + policy: string; +} + +export interface AddServiceAccountPolicyRequest { + policy: string; +} + +export interface ListPoliciesResponse { + /** list of policies */ + policies?: Policy[]; + /** + * total number of policies + * @format int64 + */ + total?: number; +} + +export interface ListAccessRulesResponse { + /** list of policies */ + accessRules?: AccessRule[]; + /** + * total number of policies + * @format int64 + */ + total?: number; +} + +export interface AccessRule { + prefix?: string; + access?: string; +} + +export interface UpdateGroupRequest { + members: string[]; + status: string; +} + +export interface ConfigDescription { + key?: string; + description?: string; +} + +export interface ConfigurationKV { + key?: string; + value?: string; + env_override?: EnvOverride; +} + +export interface EnvOverride { + name?: string; + value?: string; +} + +export interface Configuration { + name?: string; + key_values?: ConfigurationKV[]; +} + +export interface ListConfigResponse { + configurations?: ConfigDescription[]; + /** + * total number of configurations + * @format int64 + */ + total?: number; +} + +export interface SetConfigRequest { + /** @minItems 1 */ + key_values: ConfigurationKV[]; + /** Used if configuration is an event notification's target */ + arn_resource_id?: string; +} + +export enum NotificationEventType { + Put = "put", + Delete = "delete", + Get = "get", +} + +export interface NotificationConfig { + id?: string; + arn: string; + /** filter specific type of event. Defaults to all event (default: '[put,delete,get]') */ + events?: NotificationEventType[]; + /** filter event associated to the specified prefix */ + prefix?: string; + /** filter event associated to the specified suffix */ + suffix?: string; +} + +export interface NotificationDeleteRequest { + /** + * filter specific type of event. Defaults to all event (default: '[put,delete,get]') + * @minLength 1 + */ + events: NotificationEventType[]; + /** filter event associated to the specified prefix */ + prefix: string; + /** filter event associated to the specified suffix */ + suffix: string; +} + +export interface BucketEventRequest { + configuration: NotificationConfig; + ignoreExisting?: boolean; +} + +export interface BucketReplicationDestination { + bucket?: string; +} + +export interface BucketReplicationRule { + id?: string; + status?: "Enabled" | "Disabled"; + /** @format int32 */ + priority?: number; + /** @default "async" */ + syncMode?: "async" | "sync"; + bandwidth?: string; + healthCheckPeriod?: number; + delete_marker_replication?: boolean; + deletes_replication?: boolean; + existingObjects?: boolean; + metadata_replication?: boolean; + prefix?: string; + tags?: string; + storageClass?: string; + destination?: BucketReplicationDestination; +} + +export interface BucketReplicationRuleList { + rules?: string[]; +} + +export interface BucketReplicationResponse { + rules?: BucketReplicationRule[]; +} + +export interface ListExternalBucketsParams { + /** @minLength 3 */ + accessKey: string; + /** @minLength 8 */ + secretKey: string; + targetURL: string; + useTLS: boolean; + region?: string; +} + +export interface MultiBucketReplication { + /** @minLength 3 */ + accessKey: string; + /** @minLength 8 */ + secretKey: string; + targetURL: string; + region?: string; + /** @default "async" */ + syncMode?: "async" | "sync"; + /** @format int64 */ + bandwidth?: number; + /** @format int32 */ + healthCheckPeriod?: number; + prefix?: string; + tags?: string; + replicateDeleteMarkers?: boolean; + replicateDeletes?: boolean; + replicateMetadata?: boolean; + /** + * @format int32 + * @default 0 + */ + priority?: number; + /** @default "" */ + storageClass?: string; + /** @minLength 1 */ + bucketsRelation: MultiBucketsRelation[]; +} + +export interface MultiBucketReplicationEdit { + ruleState?: boolean; + arn?: string; + prefix?: string; + /** @default "" */ + tags?: string; + replicateDeleteMarkers?: boolean; + replicateDeletes?: boolean; + replicateMetadata?: boolean; + replicateExistingObjects?: boolean; + /** + * @format int32 + * @default 0 + */ + priority?: number; + /** @default "" */ + storageClass?: string; +} + +export interface MultiBucketsRelation { + originBucket?: string; + destinationBucket?: string; +} + +export interface MultiBucketResponseItem { + originBucket?: string; + targetBucket?: string; + errorString?: string; +} + +export interface MultiBucketResponseState { + replicationState?: MultiBucketResponseItem[]; +} + +export interface AddBucketReplication { + arn?: string; + destination_bucket?: string; +} + +export interface ListBucketEventsResponse { + events?: NotificationConfig[]; + /** + * total number of bucket events + * @format int64 + */ + total?: number; +} + +export interface SetBucketPolicyRequest { + access: BucketAccess; + definition?: string; +} + +export interface BucketQuota { + quota?: number; + type?: "hard"; +} + +export interface SetBucketQuota { + enabled: boolean; + quota_type?: "hard"; + amount?: number; +} + +export interface LoginDetails { + loginStrategy?: + | "form" + | "redirect" + | "service-account" + | "redirect-service-account"; + redirectRules?: RedirectRule[]; + isDirectPV?: boolean; + isK8S?: boolean; +} + +export interface LoginOauth2AuthRequest { + state: string; + code: string; +} + +export interface LoginRequest { + accessKey?: string; + secretKey?: string; + sts?: string; + features?: { + hide_menu?: boolean; + }; +} + +export interface LoginResponse { + sessionId?: string; + IDPRefreshToken?: string; +} + +export interface LogoutRequest { + state?: string; +} + +export interface Principal { + STSAccessKeyID?: string; + STSSecretAccessKey?: string; + STSSessionToken?: string; + accountAccessKey?: string; + hm?: boolean; + ob?: boolean; + customStyleOb?: string; +} + +export interface StartProfilingItem { + nodeName?: string; + success?: boolean; + error?: string; +} + +export interface StartProfilingList { + /** + * number of start results + * @format int64 + */ + total?: number; + startResults?: StartProfilingItem[]; +} + +export interface ProfilingStartRequest { + type: string; +} + +export interface SessionResponse { + features?: string[]; + status?: "ok"; + operator?: boolean; + distributedMode?: boolean; + serverEndPoint?: string; + permissions?: Record; + customStyles?: string; + allowResources?: PermissionResource[]; + envConstants?: EnvironmentConstants; +} + +export interface WidgetResult { + metric?: Record; + values?: any[]; +} + +export interface ResultTarget { + legendFormat?: string; + resultType?: string; + result?: WidgetResult[]; +} + +export interface Widget { + title?: string; + type?: string; + /** @format int32 */ + id?: number; + options?: { + reduceOptions?: { + calcs?: string[]; + }; + }; + targets?: ResultTarget[]; +} + +export interface WidgetDetails { + title?: string; + type?: string; + /** @format int32 */ + id?: number; + options?: { + reduceOptions?: { + calcs?: string[]; + }; + }; + targets?: ResultTarget[]; +} + +export interface AdminInfoResponse { + buckets?: number; + objects?: number; + usage?: number; + advancedMetricsStatus?: "not configured" | "available" | "unavailable"; + widgets?: Widget[]; + servers?: ServerProperties[]; + backend?: BackendProperties; +} + +export interface ServerProperties { + state?: string; + endpoint?: string; + uptime?: number; + version?: string; + commitID?: string; + poolNumber?: number; + network?: Record; + drives?: ServerDrives[]; +} + +export interface ServerDrives { + uuid?: string; + state?: string; + endpoint?: string; + drivePath?: string; + rootDisk?: boolean; + healing?: boolean; + model?: string; + totalSpace?: number; + usedSpace?: number; + availableSpace?: number; +} + +export interface BackendProperties { + backendType?: string; + rrSCParity?: number; + standardSCParity?: number; +} + +export interface ArnsResponse { + arns?: string[]; +} + +export interface UpdateUserGroups { + groups: string[]; +} + +export enum NofiticationService { + Webhook = "webhook", + Amqp = "amqp", + Kafka = "kafka", + Mqtt = "mqtt", + Nats = "nats", + Nsq = "nsq", + Mysql = "mysql", + Postgres = "postgres", + Elasticsearch = "elasticsearch", + Redis = "redis", +} + +export interface NotificationEndpointItem { + service?: NofiticationService; + account_id?: string; + status?: string; +} + +export interface NotificationEndpoint { + service: NofiticationService; + account_id: string; + properties: Record; +} + +export interface SetNotificationEndpointResponse { + service: NofiticationService; + account_id: string; + properties: Record; + restart?: boolean; +} + +export interface NotifEndpointResponse { + notification_endpoints?: NotificationEndpointItem[]; +} + +export interface PeerSiteRemoveResponse { + status?: string; + errorDetail?: string; +} + +export interface PeerSiteEditResponse { + success?: boolean; + status?: string; + errorDetail?: string; +} + +export interface PeerSite { + name?: string; + endpoint?: string; + accessKey?: string; + secretKey?: string; +} + +export interface PeerInfo { + endpoint?: string; + name?: string; + deploymentID?: string; +} + +export interface PeerInfoRemove { + all?: boolean; + sites: string[]; +} + +export type SiteReplicationAddRequest = PeerSite[]; + +export interface SiteReplicationAddResponse { + success?: boolean; + status?: string; + errorDetail?: string; + initialSyncErrorMessage?: string; +} + +export interface SiteReplicationInfoResponse { + enabled?: boolean; + name?: string; + sites?: PeerInfo[]; + serviceAccountAccessKey?: string; +} + +export interface SiteReplicationStatusResponse { + enabled?: boolean; + maxBuckets?: number; + maxUsers?: number; + maxGroups?: number; + maxPolicies?: number; + sites?: object; + statsSummary?: object; + bucketStats?: object; + policyStats?: object; + userStats?: object; + groupStats?: object; +} + +export interface UpdateUser { + status: string; + groups: string[]; +} + +export interface BulkUserGroups { + users: string[]; + groups: string[]; +} + +export type ServiceAccounts = string[]; + +export interface ServiceAccountRequest { + /** policy to be applied to the Service Account if any */ + policy?: string; +} + +export interface ServiceAccountRequestCreds { + /** policy to be applied to the Service Account if any */ + policy?: string; + accessKey?: string; + secretKey?: string; +} + +export interface ServiceAccountCreds { + accessKey?: string; + secretKey?: string; + url?: string; +} + +export interface RemoteBucket { + /** @minLength 3 */ + accessKey: string; + /** @minLength 8 */ + secretKey?: string; + sourceBucket: string; + targetURL?: string; + targetBucket?: string; + remoteARN: string; + status?: string; + service?: "replication"; + syncMode?: string; + /** @format int64 */ + bandwidth?: number; + healthCheckPeriod?: number; +} + +export interface CreateRemoteBucket { + /** @minLength 3 */ + accessKey: string; + /** @minLength 8 */ + secretKey: string; + targetURL: string; + sourceBucket: string; + targetBucket: string; + region?: string; + /** @default "async" */ + syncMode?: "async" | "sync"; + /** @format int64 */ + bandwidth?: number; + /** @format int32 */ + healthCheckPeriod?: number; +} + +export interface ListRemoteBucketsResponse { + /** list of remote buckets */ + buckets?: RemoteBucket[]; + /** + * number of remote buckets accessible to user + * @format int64 + */ + total?: number; +} + +export interface BucketVersioningResponse { + Status?: string; + MFADelete?: string; + ExcludedPrefixes?: { + Prefix?: string; + }[]; + ExcludeFolders?: boolean; +} + +export interface SetBucketVersioning { + versioning?: boolean; +} + +export interface BucketObLockingResponse { + object_locking_enabled?: boolean; +} + +export interface LogSearchResponse { + /** list of log search responses */ + results?: object; +} + +export enum ObjectLegalHoldStatus { + Enabled = "enabled", + Disabled = "disabled", +} + +export interface PutObjectLegalHoldRequest { + status: ObjectLegalHoldStatus; +} + +export enum ObjectRetentionMode { + Governance = "governance", + Compliance = "compliance", +} + +export interface PutObjectRetentionRequest { + mode: ObjectRetentionMode; + expires: string; + governance_bypass?: boolean; +} + +export interface PutObjectTagsRequest { + tags?: any; +} + +export interface PutBucketTagsRequest { + tags?: any; +} + +export enum ObjectRetentionUnit { + Days = "days", + Years = "years", +} + +export interface PutBucketRetentionRequest { + mode: ObjectRetentionMode; + unit: ObjectRetentionUnit; + /** @format int32 */ + validity: number; +} + +export interface GetBucketRetentionConfig { + mode?: ObjectRetentionMode; + unit?: ObjectRetentionUnit; + /** @format int32 */ + validity?: number; +} + +export interface BucketLifecycleResponse { + lifecycle?: ObjectBucketLifecycle[]; +} + +export interface ExpirationResponse { + date?: string; + /** @format int64 */ + days?: number; + delete_marker?: boolean; + /** @format int64 */ + noncurrent_expiration_days?: number; +} + +export interface TransitionResponse { + date?: string; + storage_class?: string; + /** @format int64 */ + days?: number; + /** @format int64 */ + noncurrent_transition_days?: number; + noncurrent_storage_class?: string; +} + +export interface LifecycleTag { + key?: string; + value?: string; +} + +export interface ObjectBucketLifecycle { + id?: string; + prefix?: string; + status?: string; + expiration?: ExpirationResponse; + transition?: TransitionResponse; + tags?: LifecycleTag[]; +} + +export interface AddBucketLifecycle { + /** ILM Rule type (Expiry or transition) */ + type?: "expiry" | "transition"; + /** Non required field, it matches a prefix to perform ILM operations on it */ + prefix?: string; + /** Non required field, tags to match ILM files */ + tags?: string; + /** + * Required in case of expiry_date or transition fields are not set. it defines an expiry days for ILM + * @format int32 + * @default 0 + */ + expiry_days?: number; + /** + * Required in case of transition_date or expiry fields are not set. it defines a transition days for ILM + * @format int32 + * @default 0 + */ + transition_days?: number; + /** Required only in case of transition is set. it refers to a tier */ + storage_class?: string; + /** Non required, toggle to disable or enable rule */ + disable?: boolean; + /** Non required, toggle to disable or enable rule */ + expired_object_delete_marker?: boolean; + /** + * Non required, can be set in case of expiration is enabled + * @format int32 + * @default 0 + */ + noncurrentversion_expiration_days?: number; + /** + * Non required, can be set in case of transition is enabled + * @format int32 + * @default 0 + */ + noncurrentversion_transition_days?: number; + /** Non required, can be set in case of transition is enabled */ + noncurrentversion_transition_storage_class?: string; +} + +export interface UpdateBucketLifecycle { + /** ILM Rule type (Expiry or transition) */ + type: "expiry" | "transition"; + /** Non required field, it matches a prefix to perform ILM operations on it */ + prefix?: string; + /** Non required field, tags to match ILM files */ + tags?: string; + /** + * Required in case of expiry_date or transition fields are not set. it defines an expiry days for ILM + * @format int32 + * @default 0 + */ + expiry_days?: number; + /** + * Required in case of transition_date or expiry fields are not set. it defines a transition days for ILM + * @format int32 + * @default 0 + */ + transition_days?: number; + /** Required only in case of transition is set. it refers to a tier */ + storage_class?: string; + /** Non required, toggle to disable or enable rule */ + disable?: boolean; + /** Non required, toggle to disable or enable rule */ + expired_object_delete_marker?: boolean; + /** + * Non required, can be set in case of expiration is enabled + * @format int32 + * @default 0 + */ + noncurrentversion_expiration_days?: number; + /** + * Non required, can be set in case of transition is enabled + * @format int32 + * @default 0 + */ + noncurrentversion_transition_days?: number; + /** Non required, can be set in case of transition is enabled */ + noncurrentversion_transition_storage_class?: string; +} + +export interface AddMultiBucketLifecycle { + buckets: string[]; + /** ILM Rule type (Expiry or transition) */ + type: "expiry" | "transition"; + /** Non required field, it matches a prefix to perform ILM operations on it */ + prefix?: string; + /** Non required field, tags to match ILM files */ + tags?: string; + /** + * Required in case of expiry_date or transition fields are not set. it defines an expiry days for ILM + * @format int32 + * @default 0 + */ + expiry_days?: number; + /** + * Required in case of transition_date or expiry fields are not set. it defines a transition days for ILM + * @format int32 + * @default 0 + */ + transition_days?: number; + /** Required only in case of transition is set. it refers to a tier */ + storage_class?: string; + /** Non required, toggle to disable or enable rule */ + expired_object_delete_marker?: boolean; + /** + * Non required, can be set in case of expiration is enabled + * @format int32 + * @default 0 + */ + noncurrentversion_expiration_days?: number; + /** + * Non required, can be set in case of transition is enabled + * @format int32 + * @default 0 + */ + noncurrentversion_transition_days?: number; + /** Non required, can be set in case of transition is enabled */ + noncurrentversion_transition_storage_class?: string; +} + +export interface MulticycleResultItem { + bucketName?: string; + error?: string; +} + +export interface MultiLifecycleResult { + results?: MulticycleResultItem[]; +} + +export interface PrefixAccessPair { + prefix?: string; + access?: string; +} + +export interface PrefixWrapper { + prefix?: string; +} + +export interface SetConfigResponse { + /** Returns wheter server needs to restart to apply changes or not */ + restart?: boolean; +} + +export interface ConfigExportResponse { + /** Returns base64 encoded value */ + value?: string; + status?: string; +} + +export interface License { + email?: string; + organization?: string; + account_id?: number; + storage_capacity?: number; + plan?: string; + expires_at?: string; +} + +export interface ApiKey { + apiKey?: string; +} + +export interface PolicyArgs { + id?: string; + action?: string; + bucket_name?: string; +} + +export interface TierS3 { + name?: string; + endpoint?: string; + accesskey?: string; + secretkey?: string; + bucket?: string; + prefix?: string; + region?: string; + storageclass?: string; + usage?: string; + objects?: string; + versions?: string; +} + +export interface TierMinio { + name?: string; + endpoint?: string; + accesskey?: string; + secretkey?: string; + bucket?: string; + prefix?: string; + region?: string; + storageclass?: string; + usage?: string; + objects?: string; + versions?: string; +} + +export interface TierAzure { + name?: string; + endpoint?: string; + accountname?: string; + accountkey?: string; + bucket?: string; + prefix?: string; + region?: string; + usage?: string; + objects?: string; + versions?: string; +} + +export interface TierGcs { + name?: string; + endpoint?: string; + creds?: string; + bucket?: string; + prefix?: string; + region?: string; + usage?: string; + objects?: string; + versions?: string; +} + +export interface DeleteFile { + path?: string; + versionID?: string; + recursive?: boolean; +} + +export interface UserSAs { + path?: string; + versionID?: string; + recursive?: boolean; +} + +export interface Tier { + status?: boolean; + type?: "s3" | "gcs" | "azure" | "minio" | "unsupported"; + s3?: TierS3; + gcs?: TierGcs; + azure?: TierAzure; + minio?: TierMinio; +} + +export interface TierListResponse { + items?: Tier[]; +} + +export interface TierCredentialsRequest { + access_key?: string; + secret_key?: string; + /** a base64 encoded value */ + creds?: string; +} + +export interface RewindItem { + last_modified?: string; + /** @format int64 */ + size?: number; + version_id?: string; + delete_flag?: boolean; + action?: string; + name?: string; + is_latest?: boolean; +} + +export interface RewindResponse { + objects?: RewindItem[]; +} + +export interface IamPolicy { + version?: string; + statement?: IamPolicyStatement[]; +} + +export interface IamPolicyStatement { + effect?: string; + action?: string[]; + resource?: string[]; + condition?: Record; +} + +export interface Metadata { + objectMetadata?: Record; +} + +export interface SubnetLoginResponse { + access_token?: string; + organizations?: SubnetOrganization[]; + mfa_token?: string; + registered?: boolean; +} + +export interface SubnetLoginRequest { + username?: string; + password?: string; + apiKey?: string; +} + +export interface SubnetLoginMFARequest { + username: string; + otp: string; + mfa_token: string; +} + +export interface SubnetRegisterRequest { + token: string; + account_id: string; +} + +export interface SubnetRegTokenResponse { + regToken?: string; +} + +export interface SubnetOrganization { + userId?: number; + accountId?: number; + subscriptionStatus?: string; + isAccountOwner?: boolean; + company?: string; + shortName?: string; +} + +export interface CheckVersionResponse { + current_version?: string; + latest_version?: string; +} + +export interface PermissionResource { + resource?: string; + conditionOperator?: string; + prefixes?: string[]; +} + +export interface AUserPolicyResponse { + policy?: string; +} + +export interface KmsStatusResponse { + name?: string; + defaultKeyID?: string; + endpoints?: KmsEndpoint[]; +} + +export interface KmsEndpoint { + url?: string; + status?: string; +} + +export interface KmsKeyStatusResponse { + keyID?: string; + encryptionErr?: string; + decryptionErr?: string; +} + +export interface KmsCreateKeyRequest { + key: string; +} + +export interface KmsImportKeyRequest { + bytes: string; +} + +export type KmDeleteKeyRequest = object; + +export interface KmsListKeysResponse { + results?: KmsKeyInfo[]; +} + +export interface KmsKeyInfo { + name?: string; + createdAt?: string; + createdBy?: string; +} + +export interface KmsGetPolicyResponse { + allow?: string[]; + deny?: string[]; +} + +export interface KmsSetPolicyRequest { + policy: string; + allow?: string[]; + deny?: string[]; +} + +export interface KmsDescribePolicyResponse { + createdAt?: string; + createdBy?: string; + name?: string; +} + +export interface KmsAssignPolicyRequest { + identity?: string; +} + +export interface KmsListPoliciesResponse { + results?: KmsPolicyInfo[]; +} + +export interface KmsPolicyInfo { + name?: string; + createdAt?: string; + createdBy?: string; +} + +export interface KmsDescribeIdentityResponse { + policy?: string; + identity?: string; + admin?: boolean; + createdAt?: string; + createdBy?: string; +} + +export interface KmsDescribeSelfIdentityResponse { + identity?: string; + policyName?: string; + admin?: boolean; + createdAt?: string; + createdBy?: string; + policy?: KmsGetPolicyResponse; +} + +export interface KmsListIdentitiesResponse { + results?: KmsIdentityInfo[]; +} + +export interface KmsIdentityInfo { + identity?: string; + policy?: string; + error?: string; + createdAt?: string; + createdBy?: string; +} + +export interface KmsMetricsResponse { + requestOK: number; + requestErr: number; + requestFail: number; + requestActive: number; + auditEvents: number; + errorEvents: number; + latencyHistogram: KmsLatencyHistogram[]; + uptime: number; + cpus: number; + usableCPUs: number; + threads: number; + heapAlloc: number; + heapObjects?: number; + stackAlloc: number; +} + +export interface KmsLatencyHistogram { + duration?: number; + total?: number; +} + +export interface KmsAPIsResponse { + results?: KmsAPI[]; +} + +export interface KmsAPI { + method?: string; + path?: string; + maxBody?: number; + timeout?: number; +} + +export interface KmsVersionResponse { + version?: string; +} + +export interface EnvironmentConstants { + maxConcurrentUploads?: number; + maxConcurrentDownloads?: number; +} + +export interface RedirectRule { + redirect?: string; + displayName?: string; + serviceType?: string; +} + +export interface IdpServerConfiguration { + name?: string; + input?: string; + type?: string; + enabled?: boolean; + info?: IdpServerConfigurationInfo[]; +} + +export interface IdpServerConfigurationInfo { + key?: string; + value?: string; + isCfg?: boolean; + isEnv?: boolean; +} + +export interface IdpListConfigurationsResponse { + results?: IdpServerConfiguration[]; +} + +export interface SetIDPResponse { + restart?: boolean; +} + +export interface ReleaseListResponse { + results?: ReleaseInfo[]; +} + +export interface ReleaseInfo { + metadata?: ReleaseMetadata; + notesContent?: string; + securityContent?: string; + breakingChangesContent?: string; + contextContent?: string; + newFeaturesContent?: string; +} + +export interface ReleaseMetadata { + tag_name?: string; + target_commitish?: string; + name?: string; + draft?: boolean; + prerelease?: boolean; + id?: number; + created_at?: string; + published_at?: string; + url?: string; + html_url?: string; + assets_url?: string; + upload_url?: string; + zipball_url?: string; + tarball_url?: string; + author?: ReleaseAuthor; + node_id?: string; +} + +export interface ReleaseAuthor { + login?: string; + id?: number; + node_id?: string; + avatar_url?: string; + html_url?: string; + gravatar_id?: string; + type?: string; + site_admin?: boolean; + url?: string; + events_url?: string; + following_url?: string; + followers_url?: string; + gists_url?: string; + organizations_url?: string; + receivedEvents_url?: string; + repos_url?: string; + starred_url?: string; + subscriptions_url?: string; +} + +export interface CallHomeGetResponse { + diagnosticsStatus?: boolean; + logsStatus?: boolean; +} + +export interface CallHomeSetStatus { + diagState: boolean; + logsState: boolean; +} + +export interface LdapEntitiesRequest { + users?: string[]; + groups?: string[]; + policies?: string[]; +} + +export interface LdapEntities { + timestamp?: string; + users?: LdapUserPolicyEntity[]; + groups?: LdapGroupPolicyEntity[]; + policies?: LdapPolicyEntity[]; +} + +export interface LdapUserPolicyEntity { + user?: string; + policies?: string[]; +} + +export interface LdapGroupPolicyEntity { + group?: string; + policies?: string[]; +} + +export interface LdapPolicyEntity { + policy?: string; + users?: string[]; + groups?: string[]; +} + +export type QueryParamsType = Record; +export type ResponseFormat = keyof Omit; + +export interface FullRequestParams extends Omit { + /** set parameter to `true` for call `securityWorker` for this request */ + secure?: boolean; + /** request path */ + path: string; + /** content type of request body */ + type?: ContentType; + /** query params */ + query?: QueryParamsType; + /** format of response (i.e. response.json() -> format: "json") */ + format?: ResponseFormat; + /** request body */ + body?: unknown; + /** base url */ + baseUrl?: string; + /** request cancellation token */ + cancelToken?: CancelToken; +} + +export type RequestParams = Omit< + FullRequestParams, + "body" | "method" | "query" | "path" +>; + +export interface ApiConfig { + baseUrl?: string; + baseApiParams?: Omit; + securityWorker?: ( + securityData: SecurityDataType | null + ) => Promise | RequestParams | void; + customFetch?: typeof fetch; +} + +export interface HttpResponse + extends Response { + data: D; + error: E; +} + +type CancelToken = Symbol | string | number; + +export enum ContentType { + Json = "application/json", + FormData = "multipart/form-data", + UrlEncoded = "application/x-www-form-urlencoded", + Text = "text/plain", +} + +export class HttpClient { + public baseUrl: string = "/api/v1"; + private securityData: SecurityDataType | null = null; + private securityWorker?: ApiConfig["securityWorker"]; + private abortControllers = new Map(); + private customFetch = (...fetchParams: Parameters) => + fetch(...fetchParams); + + private baseApiParams: RequestParams = { + credentials: "same-origin", + headers: {}, + redirect: "follow", + referrerPolicy: "no-referrer", + }; + + constructor(apiConfig: ApiConfig = {}) { + Object.assign(this, apiConfig); + } + + public setSecurityData = (data: SecurityDataType | null) => { + this.securityData = data; + }; + + protected encodeQueryParam(key: string, value: any) { + const encodedKey = encodeURIComponent(key); + return `${encodedKey}=${encodeURIComponent( + typeof value === "number" ? value : `${value}` + )}`; + } + + protected addQueryParam(query: QueryParamsType, key: string) { + return this.encodeQueryParam(key, query[key]); + } + + protected addArrayQueryParam(query: QueryParamsType, key: string) { + const value = query[key]; + return value.map((v: any) => this.encodeQueryParam(key, v)).join("&"); + } + + protected toQueryString(rawQuery?: QueryParamsType): string { + const query = rawQuery || {}; + const keys = Object.keys(query).filter( + (key) => "undefined" !== typeof query[key] + ); + return keys + .map((key) => + Array.isArray(query[key]) + ? this.addArrayQueryParam(query, key) + : this.addQueryParam(query, key) + ) + .join("&"); + } + + protected addQueryParams(rawQuery?: QueryParamsType): string { + const queryString = this.toQueryString(rawQuery); + return queryString ? `?${queryString}` : ""; + } + + private contentFormatters: Record any> = { + [ContentType.Json]: (input: any) => + input !== null && (typeof input === "object" || typeof input === "string") + ? JSON.stringify(input) + : input, + [ContentType.Text]: (input: any) => + input !== null && typeof input !== "string" + ? JSON.stringify(input) + : input, + [ContentType.FormData]: (input: any) => + Object.keys(input || {}).reduce((formData, key) => { + const property = input[key]; + formData.append( + key, + property instanceof Blob + ? property + : typeof property === "object" && property !== null + ? JSON.stringify(property) + : `${property}` + ); + return formData; + }, new FormData()), + [ContentType.UrlEncoded]: (input: any) => this.toQueryString(input), + }; + + protected mergeRequestParams( + params1: RequestParams, + params2?: RequestParams + ): RequestParams { + return { + ...this.baseApiParams, + ...params1, + ...(params2 || {}), + headers: { + ...(this.baseApiParams.headers || {}), + ...(params1.headers || {}), + ...((params2 && params2.headers) || {}), + }, + }; + } + + protected createAbortSignal = ( + cancelToken: CancelToken + ): AbortSignal | undefined => { + if (this.abortControllers.has(cancelToken)) { + const abortController = this.abortControllers.get(cancelToken); + if (abortController) { + return abortController.signal; + } + return void 0; + } + + const abortController = new AbortController(); + this.abortControllers.set(cancelToken, abortController); + return abortController.signal; + }; + + public abortRequest = (cancelToken: CancelToken) => { + const abortController = this.abortControllers.get(cancelToken); + + if (abortController) { + abortController.abort(); + this.abortControllers.delete(cancelToken); + } + }; + + public request = async ({ + body, + secure, + path, + type, + query, + format, + baseUrl, + cancelToken, + ...params + }: FullRequestParams): Promise> => { + const secureParams = + ((typeof secure === "boolean" ? secure : this.baseApiParams.secure) && + this.securityWorker && + (await this.securityWorker(this.securityData))) || + {}; + const requestParams = this.mergeRequestParams(params, secureParams); + const queryString = query && this.toQueryString(query); + const payloadFormatter = this.contentFormatters[type || ContentType.Json]; + const responseFormat = format || requestParams.format; + + return this.customFetch( + `${baseUrl || this.baseUrl || ""}${path}${ + queryString ? `?${queryString}` : "" + }`, + { + ...requestParams, + headers: { + ...(requestParams.headers || {}), + ...(type && type !== ContentType.FormData + ? { "Content-Type": type } + : {}), + }, + signal: cancelToken + ? this.createAbortSignal(cancelToken) + : requestParams.signal, + body: + typeof body === "undefined" || body === null + ? null + : payloadFormatter(body), + } + ).then(async (response) => { + const r = response as HttpResponse; + r.data = null as unknown as T; + r.error = null as unknown as E; + + const data = !responseFormat + ? r + : await response[responseFormat]() + .then((data) => { + if (r.ok) { + r.data = data; + } else { + r.error = data; + } + return r; + }) + .catch((e) => { + r.error = e; + return r; + }); + + if (cancelToken) { + this.abortControllers.delete(cancelToken); + } + + if (!response.ok) throw data; + return data; + }); + }; +} + +/** + * @title MinIO Console Server + * @version 0.1.0 + * @baseUrl /api/v1 + */ +export class Api< + SecurityDataType extends unknown +> extends HttpClient { + login = { + /** + * No description + * + * @tags Auth + * @name LoginDetail + * @summary Returns login strategy, form or sso. + * @request GET:/login + */ + loginDetail: (params: RequestParams = {}) => + this.request({ + path: `/login`, + method: "GET", + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Auth + * @name Login + * @summary Login to Console + * @request POST:/login + */ + login: (body: LoginRequest, params: RequestParams = {}) => + this.request({ + path: `/login`, + method: "POST", + body: body, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Auth + * @name LoginOauth2Auth + * @summary Identity Provider oauth2 callback endpoint. + * @request POST:/login/oauth2/auth + */ + loginOauth2Auth: ( + body: LoginOauth2AuthRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/login/oauth2/auth`, + method: "POST", + body: body, + type: ContentType.Json, + ...params, + }), + }; + logout = { + /** + * No description + * + * @tags Auth + * @name Logout + * @summary Logout from Console. + * @request POST:/logout + * @secure + */ + logout: (body: LogoutRequest, params: RequestParams = {}) => + this.request({ + path: `/logout`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + }; + session = { + /** + * No description + * + * @tags Auth + * @name SessionCheck + * @summary Endpoint to check if your session is still valid + * @request GET:/session + * @secure + */ + sessionCheck: (params: RequestParams = {}) => + this.request({ + path: `/session`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + }; + checkVersion = { + /** + * No description + * + * @tags System + * @name CheckMinIoVersion + * @summary Checks the current MinIO version against the latest + * @request GET:/check-version + */ + checkMinIoVersion: (params: RequestParams = {}) => + this.request({ + path: `/check-version`, + method: "GET", + format: "json", + ...params, + }), + }; + account = { + /** + * No description + * + * @tags Account + * @name AccountChangePassword + * @summary Change password of currently logged in user. + * @request POST:/account/change-password + * @secure + */ + accountChangePassword: ( + body: AccountChangePasswordRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/account/change-password`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Account + * @name ChangeUserPassword + * @summary Change password of currently logged in user. + * @request POST:/account/change-user-password + * @secure + */ + changeUserPassword: ( + body: ChangeUserPasswordRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/account/change-user-password`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + }; + buckets = { + /** + * No description + * + * @tags Bucket + * @name ListBuckets + * @summary List Buckets + * @request GET:/buckets + * @secure + */ + listBuckets: (params: RequestParams = {}) => + this.request({ + path: `/buckets`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name MakeBucket + * @summary Make bucket + * @request POST:/buckets + * @secure + */ + makeBucket: (body: MakeBucketRequest, params: RequestParams = {}) => + this.request({ + path: `/buckets`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name BucketInfo + * @summary Bucket Info + * @request GET:/buckets/{name} + * @secure + */ + bucketInfo: (name: string, params: RequestParams = {}) => + this.request({ + path: `/buckets/${name}`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name DeleteBucket + * @summary Delete Bucket + * @request DELETE:/buckets/{name} + * @secure + */ + deleteBucket: (name: string, params: RequestParams = {}) => + this.request({ + path: `/buckets/${name}`, + method: "DELETE", + secure: true, + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name GetBucketRetentionConfig + * @summary Get Bucket's retention config + * @request GET:/buckets/{bucket_name}/retention + * @secure + */ + getBucketRetentionConfig: ( + bucketName: string, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/retention`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name SetBucketRetentionConfig + * @summary Set Bucket's retention config + * @request PUT:/buckets/{bucket_name}/retention + * @secure + */ + setBucketRetentionConfig: ( + bucketName: string, + body: PutBucketRetentionRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/retention`, + method: "PUT", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Object + * @name ListObjects + * @summary List Objects + * @request GET:/buckets/{bucket_name}/objects + * @secure + */ + listObjects: ( + bucketName: string, + query?: { + prefix?: string; + recursive?: boolean; + with_versions?: boolean; + with_metadata?: boolean; + /** @format int32 */ + limit?: number; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/objects`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Object + * @name DeleteObject + * @summary Delete Object + * @request DELETE:/buckets/{bucket_name}/objects + * @secure + */ + deleteObject: ( + bucketName: string, + query: { + path: string; + version_id?: string; + recursive?: boolean; + all_versions?: boolean; + non_current_versions?: boolean; + bypass?: boolean; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/objects`, + method: "DELETE", + query: query, + secure: true, + ...params, + }), + + /** + * No description + * + * @tags Object + * @name DeleteMultipleObjects + * @summary Delete Multiple Objects + * @request POST:/buckets/{bucket_name}/delete-objects + * @secure + */ + deleteMultipleObjects: ( + bucketName: string, + files: DeleteFile[], + query?: { + all_versions?: boolean; + bypass?: boolean; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/delete-objects`, + method: "POST", + query: query, + body: files, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Object + * @name ObjectsUploadCreate + * @summary Uploads an Object. + * @request POST:/buckets/{bucket_name}/objects/upload + * @secure + */ + objectsUploadCreate: ( + bucketName: string, + query?: { + prefix?: string; + }, + data?: any, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/objects/upload`, + method: "POST", + query: query, + body: data, + secure: true, + type: ContentType.FormData, + ...params, + }), + + /** + * No description + * + * @tags Object + * @name DownloadObject + * @summary Download Object + * @request GET:/buckets/{bucket_name}/objects/download + * @secure + */ + downloadObject: ( + bucketName: string, + query: { + prefix: string; + version_id?: string; + /** @default false */ + preview?: boolean; + /** @default "" */ + override_file_name?: string; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/objects/download`, + method: "GET", + query: query, + secure: true, + ...params, + }), + + /** + * No description + * + * @tags Object + * @name ShareObject + * @summary Shares an Object on a url + * @request GET:/buckets/{bucket_name}/objects/share + * @secure + */ + shareObject: ( + bucketName: string, + query: { + prefix: string; + version_id: string; + expires?: string; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/objects/share`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Object + * @name PutObjectLegalHold + * @summary Put Object's legalhold status + * @request PUT:/buckets/{bucket_name}/objects/legalhold + * @secure + */ + putObjectLegalHold: ( + bucketName: string, + query: { + prefix: string; + version_id: string; + }, + body: PutObjectLegalHoldRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/objects/legalhold`, + method: "PUT", + query: query, + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Object + * @name PutObjectRetention + * @summary Put Object's retention status + * @request PUT:/buckets/{bucket_name}/objects/retention + * @secure + */ + putObjectRetention: ( + bucketName: string, + query: { + prefix: string; + version_id: string; + }, + body: PutObjectRetentionRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/objects/retention`, + method: "PUT", + query: query, + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Object + * @name DeleteObjectRetention + * @summary Delete Object retention from an object + * @request DELETE:/buckets/{bucket_name}/objects/retention + * @secure + */ + deleteObjectRetention: ( + bucketName: string, + query: { + prefix: string; + version_id: string; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/objects/retention`, + method: "DELETE", + query: query, + secure: true, + ...params, + }), + + /** + * No description + * + * @tags Object + * @name PutObjectTags + * @summary Put Object's tags + * @request PUT:/buckets/{bucket_name}/objects/tags + * @secure + */ + putObjectTags: ( + bucketName: string, + query: { + prefix: string; + version_id: string; + }, + body: PutObjectTagsRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/objects/tags`, + method: "PUT", + query: query, + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Object + * @name PutObjectRestore + * @summary Restore Object to a selected version + * @request PUT:/buckets/{bucket_name}/objects/restore + * @secure + */ + putObjectRestore: ( + bucketName: string, + query: { + prefix: string; + version_id: string; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/objects/restore`, + method: "PUT", + query: query, + secure: true, + ...params, + }), + + /** + * No description + * + * @tags Object + * @name GetObjectMetadata + * @summary Gets the metadata of an object + * @request GET:/buckets/{bucket_name}/objects/metadata + * @secure + */ + getObjectMetadata: ( + bucketName: string, + query: { + prefix: string; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/objects/metadata`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name PutBucketTags + * @summary Put Bucket's tags + * @request PUT:/buckets/{bucket_name}/tags + * @secure + */ + putBucketTags: ( + bucketName: string, + body: PutBucketTagsRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/tags`, + method: "PUT", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name BucketSetPolicy + * @summary Bucket Set Policy + * @request PUT:/buckets/{name}/set-policy + * @secure + */ + bucketSetPolicy: ( + name: string, + body: SetBucketPolicyRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${name}/set-policy`, + method: "PUT", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name GetBucketQuota + * @summary Get Bucket Quota + * @request GET:/buckets/{name}/quota + * @secure + */ + getBucketQuota: (name: string, params: RequestParams = {}) => + this.request({ + path: `/buckets/${name}/quota`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name SetBucketQuota + * @summary Bucket Quota + * @request PUT:/buckets/{name}/quota + * @secure + */ + setBucketQuota: ( + name: string, + body: SetBucketQuota, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${name}/quota`, + method: "PUT", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name ListBucketEvents + * @summary List Bucket Events + * @request GET:/buckets/{bucket_name}/events + * @secure + */ + listBucketEvents: ( + bucketName: string, + query?: { + /** @format int32 */ + offset?: number; + /** @format int32 */ + limit?: number; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/events`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name CreateBucketEvent + * @summary Create Bucket Event + * @request POST:/buckets/{bucket_name}/events + * @secure + */ + createBucketEvent: ( + bucketName: string, + body: BucketEventRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/events`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name DeleteBucketEvent + * @summary Delete Bucket Event + * @request DELETE:/buckets/{bucket_name}/events/{arn} + * @secure + */ + deleteBucketEvent: ( + bucketName: string, + arn: string, + body: NotificationDeleteRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/events/${arn}`, + method: "DELETE", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name GetBucketReplication + * @summary Bucket Replication + * @request GET:/buckets/{bucket_name}/replication + * @secure + */ + getBucketReplication: (bucketName: string, params: RequestParams = {}) => + this.request({ + path: `/buckets/${bucketName}/replication`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name GetBucketReplicationRule + * @summary Bucket Replication + * @request GET:/buckets/{bucket_name}/replication/{rule_id} + * @secure + */ + getBucketReplicationRule: ( + bucketName: string, + ruleId: string, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/replication/${ruleId}`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name UpdateMultiBucketReplication + * @summary Update Replication rule + * @request PUT:/buckets/{bucket_name}/replication/{rule_id} + * @secure + */ + updateMultiBucketReplication: ( + bucketName: string, + ruleId: string, + body: MultiBucketReplicationEdit, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/replication/${ruleId}`, + method: "PUT", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name DeleteBucketReplicationRule + * @summary Bucket Replication Rule Delete + * @request DELETE:/buckets/{bucket_name}/replication/{rule_id} + * @secure + */ + deleteBucketReplicationRule: ( + bucketName: string, + ruleId: string, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/replication/${ruleId}`, + method: "DELETE", + secure: true, + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name DeleteAllReplicationRules + * @summary Deletes all replication rules from a bucket + * @request DELETE:/buckets/{bucket_name}/delete-all-replication-rules + * @secure + */ + deleteAllReplicationRules: ( + bucketName: string, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/delete-all-replication-rules`, + method: "DELETE", + secure: true, + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name DeleteSelectedReplicationRules + * @summary Deletes selected replication rules from a bucket + * @request DELETE:/buckets/{bucket_name}/delete-selected-replication-rules + * @secure + */ + deleteSelectedReplicationRules: ( + bucketName: string, + rules: BucketReplicationRuleList, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/delete-selected-replication-rules`, + method: "DELETE", + body: rules, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name GetBucketVersioning + * @summary Bucket Versioning + * @request GET:/buckets/{bucket_name}/versioning + * @secure + */ + getBucketVersioning: (bucketName: string, params: RequestParams = {}) => + this.request({ + path: `/buckets/${bucketName}/versioning`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name SetBucketVersioning + * @summary Set Bucket Versioning + * @request PUT:/buckets/{bucket_name}/versioning + * @secure + */ + setBucketVersioning: ( + bucketName: string, + body: SetBucketVersioning, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/versioning`, + method: "PUT", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name GetBucketObjectLockingStatus + * @summary Returns the status of object locking support on the bucket + * @request GET:/buckets/{bucket_name}/object-locking + * @secure + */ + getBucketObjectLockingStatus: ( + bucketName: string, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/object-locking`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name EnableBucketEncryption + * @summary Enable bucket encryption. + * @request POST:/buckets/{bucket_name}/encryption/enable + * @secure + */ + enableBucketEncryption: ( + bucketName: string, + body: BucketEncryptionRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/encryption/enable`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name DisableBucketEncryption + * @summary Disable bucket encryption. + * @request POST:/buckets/{bucket_name}/encryption/disable + * @secure + */ + disableBucketEncryption: (bucketName: string, params: RequestParams = {}) => + this.request({ + path: `/buckets/${bucketName}/encryption/disable`, + method: "POST", + secure: true, + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name GetBucketEncryptionInfo + * @summary Get bucket encryption information. + * @request GET:/buckets/{bucket_name}/encryption/info + * @secure + */ + getBucketEncryptionInfo: (bucketName: string, params: RequestParams = {}) => + this.request({ + path: `/buckets/${bucketName}/encryption/info`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name GetBucketLifecycle + * @summary Bucket Lifecycle + * @request GET:/buckets/{bucket_name}/lifecycle + * @secure + */ + getBucketLifecycle: (bucketName: string, params: RequestParams = {}) => + this.request({ + path: `/buckets/${bucketName}/lifecycle`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name AddBucketLifecycle + * @summary Add Bucket Lifecycle + * @request POST:/buckets/{bucket_name}/lifecycle + * @secure + */ + addBucketLifecycle: ( + bucketName: string, + body: AddBucketLifecycle, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/lifecycle`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name AddMultiBucketLifecycle + * @summary Add Multi Bucket Lifecycle + * @request POST:/buckets/multi-lifecycle + * @secure + */ + addMultiBucketLifecycle: ( + body: AddMultiBucketLifecycle, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/multi-lifecycle`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name UpdateBucketLifecycle + * @summary Update Lifecycle rule + * @request PUT:/buckets/{bucket_name}/lifecycle/{lifecycle_id} + * @secure + */ + updateBucketLifecycle: ( + bucketName: string, + lifecycleId: string, + body: UpdateBucketLifecycle, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/lifecycle/${lifecycleId}`, + method: "PUT", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name DeleteBucketLifecycleRule + * @summary Delete Lifecycle rule + * @request DELETE:/buckets/{bucket_name}/lifecycle/{lifecycle_id} + * @secure + */ + deleteBucketLifecycleRule: ( + bucketName: string, + lifecycleId: string, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/lifecycle/${lifecycleId}`, + method: "DELETE", + secure: true, + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name GetBucketRewind + * @summary Get objects in a bucket for a rewind date + * @request GET:/buckets/{bucket_name}/rewind/{date} + * @secure + */ + getBucketRewind: ( + bucketName: string, + date: string, + query?: { + prefix?: string; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets/${bucketName}/rewind/${date}`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + }; + listExternalBuckets = { + /** + * No description + * + * @tags Bucket + * @name ListExternalBuckets + * @summary Lists an External list of buckets using custom credentials + * @request POST:/list-external-buckets + * @secure + */ + listExternalBuckets: ( + body: ListExternalBucketsParams, + params: RequestParams = {} + ) => + this.request({ + path: `/list-external-buckets`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + }; + bucketsReplication = { + /** + * No description + * + * @tags Bucket + * @name SetMultiBucketReplication + * @summary Sets Multi Bucket Replication in multiple Buckets + * @request POST:/buckets-replication + * @secure + */ + setMultiBucketReplication: ( + body: MultiBucketReplication, + params: RequestParams = {} + ) => + this.request({ + path: `/buckets-replication`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + }; + serviceAccounts = { + /** + * No description + * + * @tags ServiceAccount + * @name ListUserServiceAccounts + * @summary List User's Service Accounts + * @request GET:/service-accounts + * @secure + */ + listUserServiceAccounts: ( + query?: { + /** @format int32 */ + offset?: number; + /** @format int32 */ + limit?: number; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/service-accounts`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags ServiceAccount + * @name CreateServiceAccount + * @summary Create Service Account + * @request POST:/service-accounts + * @secure + */ + createServiceAccount: ( + body: ServiceAccountRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/service-accounts`, + method: "POST", + body: body, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags ServiceAccount + * @name DeleteServiceAccount + * @summary Delete Service Account + * @request DELETE:/service-accounts/{access_key} + * @secure + */ + deleteServiceAccount: (accessKey: string, params: RequestParams = {}) => + this.request({ + path: `/service-accounts/${accessKey}`, + method: "DELETE", + secure: true, + ...params, + }), + + /** + * No description + * + * @tags ServiceAccount + * @name DeleteMultipleServiceAccounts + * @summary Delete Multiple Service Accounts + * @request DELETE:/service-accounts/delete-multi + * @secure + */ + deleteMultipleServiceAccounts: ( + selectedSA: string[], + params: RequestParams = {} + ) => + this.request({ + path: `/service-accounts/delete-multi`, + method: "DELETE", + body: selectedSA, + secure: true, + ...params, + }), + + /** + * No description + * + * @tags ServiceAccount + * @name GetServiceAccountPolicy + * @summary Get Service Account Policy + * @request GET:/service-accounts/{access_key}/policy + * @secure + */ + getServiceAccountPolicy: (accessKey: string, params: RequestParams = {}) => + this.request({ + path: `/service-accounts/${accessKey}/policy`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags ServiceAccount + * @name SetServiceAccountPolicy + * @summary Set Service Account Policy + * @request PUT:/service-accounts/{access_key}/policy + * @secure + */ + setServiceAccountPolicy: ( + accessKey: string, + policy: AddServiceAccountPolicyRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/service-accounts/${accessKey}/policy`, + method: "PUT", + body: policy, + secure: true, + type: ContentType.Json, + ...params, + }), + }; + serviceAccountCredentials = { + /** + * No description + * + * @tags ServiceAccount + * @name CreateServiceAccountCreds + * @summary Create Service Account With Credentials + * @request POST:/service-account-credentials + * @secure + */ + createServiceAccountCreds: ( + body: ServiceAccountRequestCreds, + params: RequestParams = {} + ) => + this.request({ + path: `/service-account-credentials`, + method: "POST", + body: body, + secure: true, + format: "json", + ...params, + }), + }; + users = { + /** + * No description + * + * @tags User + * @name ListUsers + * @summary List Users + * @request GET:/users + * @secure + */ + listUsers: ( + query?: { + /** @format int32 */ + offset?: number; + /** @format int32 */ + limit?: number; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/users`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags User + * @name AddUser + * @summary Add User + * @request POST:/users + * @secure + */ + addUser: (body: AddUserRequest, params: RequestParams = {}) => + this.request({ + path: `/users`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags User + * @name CheckUserServiceAccounts + * @summary Check number of service accounts for each user specified + * @request POST:/users/service-accounts + * @secure + */ + checkUserServiceAccounts: ( + selectedUsers: string[], + params: RequestParams = {} + ) => + this.request({ + path: `/users/service-accounts`, + method: "POST", + body: selectedUsers, + secure: true, + format: "json", + ...params, + }), + }; + user = { + /** + * No description + * + * @tags User + * @name GetUserInfo + * @summary Get User Info + * @request GET:/user/{name} + * @secure + */ + getUserInfo: (name: string, params: RequestParams = {}) => + this.request({ + path: `/user/${name}`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags User + * @name UpdateUserInfo + * @summary Update User Info + * @request PUT:/user/{name} + * @secure + */ + updateUserInfo: ( + name: string, + body: UpdateUser, + params: RequestParams = {} + ) => + this.request({ + path: `/user/${name}`, + method: "PUT", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags User + * @name RemoveUser + * @summary Remove user + * @request DELETE:/user/{name} + * @secure + */ + removeUser: (name: string, params: RequestParams = {}) => + this.request({ + path: `/user/${name}`, + method: "DELETE", + secure: true, + ...params, + }), + + /** + * No description + * + * @tags User + * @name UpdateUserGroups + * @summary Update Groups for a user + * @request PUT:/user/{name}/groups + * @secure + */ + updateUserGroups: ( + name: string, + body: UpdateUserGroups, + params: RequestParams = {} + ) => + this.request({ + path: `/user/${name}/groups`, + method: "PUT", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Policy + * @name GetUserPolicy + * @summary returns policies for logged in user + * @request GET:/user/policy + * @secure + */ + getUserPolicy: (params: RequestParams = {}) => + this.request({ + path: `/user/policy`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Policy + * @name GetSaUserPolicy + * @summary returns policies assigned for a specified user + * @request GET:/user/{name}/policies + * @secure + */ + getSaUserPolicy: (name: string, params: RequestParams = {}) => + this.request({ + path: `/user/${name}/policies`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags User + * @name ListAUserServiceAccounts + * @summary returns a list of service accounts for a user + * @request GET:/user/{name}/service-accounts + * @secure + */ + listAUserServiceAccounts: (name: string, params: RequestParams = {}) => + this.request({ + path: `/user/${name}/service-accounts`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags User + * @name CreateAUserServiceAccount + * @summary Create Service Account for User + * @request POST:/user/{name}/service-accounts + * @secure + */ + createAUserServiceAccount: ( + name: string, + body: ServiceAccountRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/user/${name}/service-accounts`, + method: "POST", + body: body, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags User + * @name CreateServiceAccountCredentials + * @summary Create Service Account for User With Credentials + * @request POST:/user/{name}/service-account-credentials + * @secure + */ + createServiceAccountCredentials: ( + name: string, + body: ServiceAccountRequestCreds, + params: RequestParams = {} + ) => + this.request({ + path: `/user/${name}/service-account-credentials`, + method: "POST", + body: body, + secure: true, + format: "json", + ...params, + }), + }; + usersGroupsBulk = { + /** + * No description + * + * @tags User + * @name BulkUpdateUsersGroups + * @summary Bulk functionality to Add Users to Groups + * @request PUT:/users-groups-bulk + * @secure + */ + bulkUpdateUsersGroups: (body: BulkUserGroups, params: RequestParams = {}) => + this.request({ + path: `/users-groups-bulk`, + method: "PUT", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + }; + groups = { + /** + * No description + * + * @tags Group + * @name ListGroups + * @summary List Groups + * @request GET:/groups + * @secure + */ + listGroups: ( + query?: { + /** @format int32 */ + offset?: number; + /** @format int32 */ + limit?: number; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/groups`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Group + * @name AddGroup + * @summary Add Group + * @request POST:/groups + * @secure + */ + addGroup: (body: AddGroupRequest, params: RequestParams = {}) => + this.request({ + path: `/groups`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + }; + group = { + /** + * No description + * + * @tags Group + * @name GroupInfo + * @summary Group info + * @request GET:/group/{name} + * @secure + */ + groupInfo: (name: string, params: RequestParams = {}) => + this.request({ + path: `/group/${name}`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Group + * @name RemoveGroup + * @summary Remove group + * @request DELETE:/group/{name} + * @secure + */ + removeGroup: (name: string, params: RequestParams = {}) => + this.request({ + path: `/group/${name}`, + method: "DELETE", + secure: true, + ...params, + }), + + /** + * No description + * + * @tags Group + * @name UpdateGroup + * @summary Update Group Members or Status + * @request PUT:/group/{name} + * @secure + */ + updateGroup: ( + name: string, + body: UpdateGroupRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/group/${name}`, + method: "PUT", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + }; + policies = { + /** + * No description + * + * @tags Policy + * @name ListPolicies + * @summary List Policies + * @request GET:/policies + * @secure + */ + listPolicies: ( + query?: { + /** @format int32 */ + offset?: number; + /** @format int32 */ + limit?: number; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/policies`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Policy + * @name AddPolicy + * @summary Add Policy + * @request POST:/policies + * @secure + */ + addPolicy: (body: AddPolicyRequest, params: RequestParams = {}) => + this.request({ + path: `/policies`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Policy + * @name ListUsersForPolicy + * @summary List Users for a Policy + * @request GET:/policies/{policy}/users + * @secure + */ + listUsersForPolicy: (policy: string, params: RequestParams = {}) => + this.request({ + path: `/policies/${policy}/users`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Policy + * @name ListGroupsForPolicy + * @summary List Groups for a Policy + * @request GET:/policies/{policy}/groups + * @secure + */ + listGroupsForPolicy: (policy: string, params: RequestParams = {}) => + this.request({ + path: `/policies/${policy}/groups`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + }; + bucketPolicy = { + /** + * No description + * + * @tags Bucket + * @name ListPoliciesWithBucket + * @summary List Policies With Given Bucket + * @request GET:/bucket-policy/{bucket} + * @secure + */ + listPoliciesWithBucket: ( + bucket: string, + query?: { + /** @format int32 */ + offset?: number; + /** @format int32 */ + limit?: number; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/bucket-policy/${bucket}`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + }; + bucket = { + /** + * No description + * + * @tags Bucket + * @name SetAccessRuleWithBucket + * @summary Add Access Rule To Given Bucket + * @request PUT:/bucket/{bucket}/access-rules + * @secure + */ + setAccessRuleWithBucket: ( + bucket: string, + prefixaccess: PrefixAccessPair, + params: RequestParams = {} + ) => + this.request({ + path: `/bucket/${bucket}/access-rules`, + method: "PUT", + body: prefixaccess, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name ListAccessRulesWithBucket + * @summary List Access Rules With Given Bucket + * @request GET:/bucket/{bucket}/access-rules + * @secure + */ + listAccessRulesWithBucket: ( + bucket: string, + query?: { + /** @format int32 */ + offset?: number; + /** @format int32 */ + limit?: number; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/bucket/${bucket}/access-rules`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name DeleteAccessRuleWithBucket + * @summary Delete Access Rule From Given Bucket + * @request DELETE:/bucket/{bucket}/access-rules + * @secure + */ + deleteAccessRuleWithBucket: ( + bucket: string, + prefix: PrefixWrapper, + params: RequestParams = {} + ) => + this.request({ + path: `/bucket/${bucket}/access-rules`, + method: "DELETE", + body: prefix, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + }; + bucketUsers = { + /** + * No description + * + * @tags Bucket + * @name ListUsersWithAccessToBucket + * @summary List Users With Access to a Given Bucket + * @request GET:/bucket-users/{bucket} + * @secure + */ + listUsersWithAccessToBucket: ( + bucket: string, + query?: { + /** @format int32 */ + offset?: number; + /** @format int32 */ + limit?: number; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/bucket-users/${bucket}`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + }; + policy = { + /** + * No description + * + * @tags Policy + * @name PolicyInfo + * @summary Policy info + * @request GET:/policy/{name} + * @secure + */ + policyInfo: (name: string, params: RequestParams = {}) => + this.request({ + path: `/policy/${name}`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Policy + * @name RemovePolicy + * @summary Remove policy + * @request DELETE:/policy/{name} + * @secure + */ + removePolicy: (name: string, params: RequestParams = {}) => + this.request({ + path: `/policy/${name}`, + method: "DELETE", + secure: true, + ...params, + }), + }; + configs = { + /** + * No description + * + * @tags Configuration + * @name ListConfig + * @summary List Configurations + * @request GET:/configs + * @secure + */ + listConfig: ( + query?: { + /** @format int32 */ + offset?: number; + /** @format int32 */ + limit?: number; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/configs`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Configuration + * @name ConfigInfo + * @summary Configuration info + * @request GET:/configs/{name} + * @secure + */ + configInfo: (name: string, params: RequestParams = {}) => + this.request({ + path: `/configs/${name}`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Configuration + * @name SetConfig + * @summary Set Configuration + * @request PUT:/configs/{name} + * @secure + */ + setConfig: ( + name: string, + body: SetConfigRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/configs/${name}`, + method: "PUT", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Configuration + * @name ResetConfig + * @summary Configuration reset + * @request POST:/configs/{name}/reset + * @secure + */ + resetConfig: (name: string, params: RequestParams = {}) => + this.request({ + path: `/configs/${name}/reset`, + method: "POST", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Configuration + * @name ExportConfig + * @summary Export the current config from MinIO server + * @request GET:/configs/export + * @secure + */ + exportConfig: (params: RequestParams = {}) => + this.request({ + path: `/configs/export`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Configuration + * @name ImportCreate + * @summary Uploads a file to import MinIO server config. + * @request POST:/configs/import + * @secure + */ + importCreate: ( + data: { + /** @format binary */ + file: File; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/configs/import`, + method: "POST", + body: data, + secure: true, + type: ContentType.FormData, + ...params, + }), + }; + setPolicy = { + /** + * No description + * + * @tags Policy + * @name SetPolicy + * @summary Set policy + * @request PUT:/set-policy + * @secure + */ + setPolicy: (body: SetPolicyNameRequest, params: RequestParams = {}) => + this.request({ + path: `/set-policy`, + method: "PUT", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + }; + setPolicyMulti = { + /** + * No description + * + * @tags Policy + * @name SetPolicyMultiple + * @summary Set policy to multiple users/groups + * @request PUT:/set-policy-multi + * @secure + */ + setPolicyMultiple: ( + body: SetPolicyMultipleNameRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/set-policy-multi`, + method: "PUT", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + }; + service = { + /** + * No description + * + * @tags Service + * @name RestartService + * @summary Restart Service + * @request POST:/service/restart + * @secure + */ + restartService: (params: RequestParams = {}) => + this.request({ + path: `/service/restart`, + method: "POST", + secure: true, + ...params, + }), + }; + profiling = { + /** + * No description + * + * @tags Profile + * @name ProfilingStart + * @summary Start recording profile data + * @request POST:/profiling/start + * @secure + */ + profilingStart: (body: ProfilingStartRequest, params: RequestParams = {}) => + this.request({ + path: `/profiling/start`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Profile + * @name ProfilingStop + * @summary Stop and download profile data + * @request POST:/profiling/stop + * @secure + */ + profilingStop: (params: RequestParams = {}) => + this.request({ + path: `/profiling/stop`, + method: "POST", + secure: true, + ...params, + }), + }; + subnet = { + /** + * No description + * + * @tags Subnet + * @name SubnetRegToken + * @summary Subnet registraton token + * @request GET:/subnet/registration-token + * @secure + */ + subnetRegToken: (params: RequestParams = {}) => + this.request({ + path: `/subnet/registration-token`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Subnet + * @name SubnetInfo + * @summary Subnet info + * @request GET:/subnet/info + * @secure + */ + subnetInfo: (params: RequestParams = {}) => + this.request({ + path: `/subnet/info`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Subnet + * @name SubnetApiKey + * @summary Subnet api key + * @request GET:/subnet/apikey + * @secure + */ + subnetApiKey: ( + query: { + token: string; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/subnet/apikey`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Subnet + * @name SubnetRegister + * @summary Register cluster with Subnet + * @request POST:/subnet/register + * @secure + */ + subnetRegister: (body: SubnetRegisterRequest, params: RequestParams = {}) => + this.request({ + path: `/subnet/register`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Subnet + * @name SubnetLogin + * @summary Login to subnet + * @request POST:/subnet/login + * @secure + */ + subnetLogin: (body: SubnetLoginRequest, params: RequestParams = {}) => + this.request({ + path: `/subnet/login`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Subnet + * @name SubnetLoginMfa + * @summary Login to subnet using mfa + * @request POST:/subnet/login/mfa + * @secure + */ + subnetLoginMfa: (body: SubnetLoginMFARequest, params: RequestParams = {}) => + this.request({ + path: `/subnet/login/mfa`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + }; + admin = { + /** + * No description + * + * @tags System + * @name AdminInfo + * @summary Returns information about the deployment + * @request GET:/admin/info + * @secure + */ + adminInfo: ( + query?: { + /** @default false */ + defaultOnly?: boolean; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/admin/info`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags System + * @name DashboardWidgetDetails + * @summary Returns information about the deployment + * @request GET:/admin/info/widgets/{widgetId} + * @secure + */ + dashboardWidgetDetails: ( + widgetId: number, + query?: { + start?: number; + end?: number; + /** @format int32 */ + step?: number; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/admin/info/widgets/${widgetId}`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags System + * @name ArnList + * @summary Returns a list of active ARNs in the instance + * @request GET:/admin/arns + * @secure + */ + arnList: (params: RequestParams = {}) => + this.request({ + path: `/admin/arns`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Configuration + * @name NotificationEndpointList + * @summary Returns a list of active notification endpoints + * @request GET:/admin/notification_endpoints + * @secure + */ + notificationEndpointList: (params: RequestParams = {}) => + this.request({ + path: `/admin/notification_endpoints`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Configuration + * @name AddNotificationEndpoint + * @summary Allows to configure a new notification endpoint + * @request POST:/admin/notification_endpoints + * @secure + */ + addNotificationEndpoint: ( + body: NotificationEndpoint, + params: RequestParams = {} + ) => + this.request({ + path: `/admin/notification_endpoints`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags SiteReplication + * @name GetSiteReplicationInfo + * @summary Get list of Replication Sites + * @request GET:/admin/site-replication + * @secure + */ + getSiteReplicationInfo: (params: RequestParams = {}) => + this.request({ + path: `/admin/site-replication`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags SiteReplication + * @name SiteReplicationInfoAdd + * @summary Add a Replication Site + * @request POST:/admin/site-replication + * @secure + */ + siteReplicationInfoAdd: ( + body: SiteReplicationAddRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/admin/site-replication`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags SiteReplication + * @name SiteReplicationEdit + * @summary Edit a Replication Site + * @request PUT:/admin/site-replication + * @secure + */ + siteReplicationEdit: (body: PeerInfo, params: RequestParams = {}) => + this.request({ + path: `/admin/site-replication`, + method: "PUT", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags SiteReplication + * @name SiteReplicationRemove + * @summary Remove a Replication Site + * @request DELETE:/admin/site-replication + * @secure + */ + siteReplicationRemove: (body: PeerInfoRemove, params: RequestParams = {}) => + this.request({ + path: `/admin/site-replication`, + method: "DELETE", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags SiteReplication + * @name GetSiteReplicationStatus + * @summary Display overall site replication status + * @request GET:/admin/site-replication/status + * @secure + */ + getSiteReplicationStatus: ( + query?: { + /** + * Include Bucket stats + * @default true + */ + buckets?: boolean; + /** + * Include Group stats + * @default true + */ + groups?: boolean; + /** + * Include Policies stats + * @default true + */ + policies?: boolean; + /** + * Include Policies stats + * @default true + */ + users?: boolean; + /** Entity Type to lookup */ + entityType?: string; + /** Entity Value to lookup */ + entityValue?: string; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/admin/site-replication/status`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Tiering + * @name TiersList + * @summary Returns a list of tiers for ilm + * @request GET:/admin/tiers + * @secure + */ + tiersList: (params: RequestParams = {}) => + this.request({ + path: `/admin/tiers`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Tiering + * @name AddTier + * @summary Allows to configure a new tier + * @request POST:/admin/tiers + * @secure + */ + addTier: (body: Tier, params: RequestParams = {}) => + this.request({ + path: `/admin/tiers`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Tiering + * @name GetTier + * @summary Get Tier + * @request GET:/admin/tiers/{type}/{name} + * @secure + */ + getTier: ( + type: "s3" | "gcs" | "azure" | "minio", + name: string, + params: RequestParams = {} + ) => + this.request({ + path: `/admin/tiers/${type}/${name}`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Tiering + * @name EditTierCredentials + * @summary Edit Tier Credentials + * @request PUT:/admin/tiers/{type}/{name}/credentials + * @secure + */ + editTierCredentials: ( + type: "s3" | "gcs" | "azure" | "minio", + name: string, + body: TierCredentialsRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/admin/tiers/${type}/${name}/credentials`, + method: "PUT", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Inspect + * @name Inspect + * @summary Inspect Files on Drive + * @request GET:/admin/inspect + * @secure + */ + inspect: ( + query: { + file: string; + volume: string; + encrypt?: boolean; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/admin/inspect`, + method: "GET", + query: query, + secure: true, + ...params, + }), + }; + nodes = { + /** + * No description + * + * @tags System + * @name ListNodes + * @summary Lists Nodes + * @request GET:/nodes + * @secure + */ + listNodes: (params: RequestParams = {}) => + this.request({ + path: `/nodes`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + }; + remoteBuckets = { + /** + * No description + * + * @tags Bucket + * @name ListRemoteBuckets + * @summary List Remote Buckets + * @request GET:/remote-buckets + * @secure + */ + listRemoteBuckets: (params: RequestParams = {}) => + this.request({ + path: `/remote-buckets`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name AddRemoteBucket + * @summary Add Remote Bucket + * @request POST:/remote-buckets + * @secure + */ + addRemoteBucket: (body: CreateRemoteBucket, params: RequestParams = {}) => + this.request({ + path: `/remote-buckets`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name RemoteBucketDetails + * @summary Remote Bucket Details + * @request GET:/remote-buckets/{name} + * @secure + */ + remoteBucketDetails: (name: string, params: RequestParams = {}) => + this.request({ + path: `/remote-buckets/${name}`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Bucket + * @name DeleteRemoteBucket + * @summary Delete Remote Bucket + * @request DELETE:/remote-buckets/{source-bucket-name}/{arn} + * @secure + */ + deleteRemoteBucket: ( + sourceBucketName: string, + arn: string, + params: RequestParams = {} + ) => + this.request({ + path: `/remote-buckets/${sourceBucketName}/${arn}`, + method: "DELETE", + secure: true, + ...params, + }), + }; + logs = { + /** + * No description + * + * @tags Logging + * @name LogSearch + * @summary Search the logs + * @request GET:/logs/search + * @secure + */ + logSearch: ( + query?: { + /** Filter Parameters */ + fp?: string[]; + /** + * @format int32 + * @default 10 + */ + pageSize?: number; + /** + * @format int32 + * @default 0 + */ + pageNo?: number; + /** @default "timeDesc" */ + order?: "timeDesc" | "timeAsc"; + timeStart?: string; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/logs/search`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + }; + kms = { + /** + * No description + * + * @tags KMS + * @name KmsStatus + * @summary KMS status + * @request GET:/kms/status + * @secure + */ + kmsStatus: (params: RequestParams = {}) => + this.request({ + path: `/kms/status`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags KMS + * @name KmsMetrics + * @summary KMS metrics + * @request GET:/kms/metrics + * @secure + */ + kmsMetrics: (params: RequestParams = {}) => + this.request({ + path: `/kms/metrics`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags KMS + * @name KmsapIs + * @summary KMS apis + * @request GET:/kms/apis + * @secure + */ + kmsapIs: (params: RequestParams = {}) => + this.request({ + path: `/kms/apis`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags KMS + * @name KmsVersion + * @summary KMS version + * @request GET:/kms/version + * @secure + */ + kmsVersion: (params: RequestParams = {}) => + this.request({ + path: `/kms/version`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags KMS + * @name KmsCreateKey + * @summary KMS create key + * @request POST:/kms/keys + * @secure + */ + kmsCreateKey: (body: KmsCreateKeyRequest, params: RequestParams = {}) => + this.request({ + path: `/kms/keys`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags KMS + * @name KmsListKeys + * @summary KMS list keys + * @request GET:/kms/keys + * @secure + */ + kmsListKeys: ( + query?: { + /** pattern to retrieve keys */ + pattern?: string; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/kms/keys`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags KMS + * @name KmsKeyStatus + * @summary KMS key status + * @request GET:/kms/keys/{name} + * @secure + */ + kmsKeyStatus: (name: string, params: RequestParams = {}) => + this.request({ + path: `/kms/keys/${name}`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags KMS + * @name KmsDeleteKey + * @summary KMS delete key + * @request DELETE:/kms/keys/{name} + * @secure + */ + kmsDeleteKey: (name: string, params: RequestParams = {}) => + this.request({ + path: `/kms/keys/${name}`, + method: "DELETE", + secure: true, + ...params, + }), + + /** + * No description + * + * @tags KMS + * @name KmsImportKey + * @summary KMS import key + * @request POST:/kms/keys/{name}/import + * @secure + */ + kmsImportKey: ( + name: string, + body: KmsImportKeyRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/kms/keys/${name}/import`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags KMS + * @name KmsSetPolicy + * @summary KMS set policy + * @request POST:/kms/policies + * @secure + */ + kmsSetPolicy: (body: KmsSetPolicyRequest, params: RequestParams = {}) => + this.request({ + path: `/kms/policies`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags KMS + * @name KmsListPolicies + * @summary KMS list policies + * @request GET:/kms/policies + * @secure + */ + kmsListPolicies: ( + query?: { + /** pattern to retrieve policies */ + pattern?: string; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/kms/policies`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags KMS + * @name KmsGetPolicy + * @summary KMS get policy + * @request GET:/kms/policies/{name} + * @secure + */ + kmsGetPolicy: (name: string, params: RequestParams = {}) => + this.request({ + path: `/kms/policies/${name}`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags KMS + * @name KmsDeletePolicy + * @summary KMS delete policy + * @request DELETE:/kms/policies/{name} + * @secure + */ + kmsDeletePolicy: (name: string, params: RequestParams = {}) => + this.request({ + path: `/kms/policies/${name}`, + method: "DELETE", + secure: true, + ...params, + }), + + /** + * No description + * + * @tags KMS + * @name KmsAssignPolicy + * @summary KMS assign policy + * @request POST:/kms/policies/{name}/assign + * @secure + */ + kmsAssignPolicy: ( + name: string, + body: KmsAssignPolicyRequest, + params: RequestParams = {} + ) => + this.request({ + path: `/kms/policies/${name}/assign`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + + /** + * No description + * + * @tags KMS + * @name KmsDescribePolicy + * @summary KMS describe policy + * @request GET:/kms/policies/{name}/describe + * @secure + */ + kmsDescribePolicy: (name: string, params: RequestParams = {}) => + this.request({ + path: `/kms/policies/${name}/describe`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags KMS + * @name KmsDeleteIdentity + * @summary KMS delete identity + * @request DELETE:/kms/identities/{name} + * @secure + */ + kmsDeleteIdentity: (name: string, params: RequestParams = {}) => + this.request({ + path: `/kms/identities/${name}`, + method: "DELETE", + secure: true, + ...params, + }), + + /** + * No description + * + * @tags KMS + * @name KmsDescribeIdentity + * @summary KMS describe identity + * @request GET:/kms/identities/{name}/describe + * @secure + */ + kmsDescribeIdentity: (name: string, params: RequestParams = {}) => + this.request({ + path: `/kms/identities/${name}/describe`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags KMS + * @name KmsDescribeSelfIdentity + * @summary KMS describe self identity + * @request GET:/kms/describe-self/identity + * @secure + */ + kmsDescribeSelfIdentity: (params: RequestParams = {}) => + this.request({ + path: `/kms/describe-self/identity`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags KMS + * @name KmsListIdentities + * @summary KMS list identities + * @request GET:/kms/identities + * @secure + */ + kmsListIdentities: ( + query?: { + /** pattern to retrieve identities */ + pattern?: string; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/kms/identities`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + }; + idp = { + /** + * No description + * + * @tags idp + * @name CreateConfiguration + * @summary Create IDP Configuration + * @request POST:/idp/{type} + * @secure + */ + createConfiguration: ( + type: string, + body: IdpServerConfiguration, + params: RequestParams = {} + ) => + this.request({ + path: `/idp/${type}`, + method: "POST", + body: body, + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags idp + * @name ListConfigurations + * @summary List IDP Configurations + * @request GET:/idp/{type} + * @secure + */ + listConfigurations: (type: string, params: RequestParams = {}) => + this.request({ + path: `/idp/${type}`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags idp + * @name GetConfiguration + * @summary Get IDP Configuration + * @request GET:/idp/{type}/{name} + * @secure + */ + getConfiguration: ( + name: string, + type: string, + params: RequestParams = {} + ) => + this.request({ + path: `/idp/${type}/${name}`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags idp + * @name DeleteConfiguration + * @summary Delete IDP Configuration + * @request DELETE:/idp/{type}/{name} + * @secure + */ + deleteConfiguration: ( + name: string, + type: string, + params: RequestParams = {} + ) => + this.request({ + path: `/idp/${type}/${name}`, + method: "DELETE", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags idp + * @name UpdateConfiguration + * @summary Update IDP Configuration + * @request PUT:/idp/{type}/{name} + * @secure + */ + updateConfiguration: ( + name: string, + type: string, + body: IdpServerConfiguration, + params: RequestParams = {} + ) => + this.request({ + path: `/idp/${type}/${name}`, + method: "PUT", + body: body, + secure: true, + format: "json", + ...params, + }), + }; + ldapEntities = { + /** + * No description + * + * @tags idp + * @name GetLdapEntities + * @summary Get LDAP Entities + * @request POST:/ldap-entities + * @secure + */ + getLdapEntities: (body: LdapEntitiesRequest, params: RequestParams = {}) => + this.request({ + path: `/ldap-entities`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }), + }; + releases = { + /** + * No description + * + * @tags release + * @name ListReleases + * @summary Get repo releases for a given version + * @request GET:/releases + * @secure + */ + listReleases: ( + query: { + /** repo name */ + repo: string; + /** Current Release */ + current?: string; + /** search content */ + search?: string; + /** filter releases */ + filter?: string; + }, + params: RequestParams = {} + ) => + this.request({ + path: `/releases`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }), + }; + support = { + /** + * No description + * + * @tags Support + * @name GetCallHomeOptionValue + * @summary Get Callhome current status + * @request GET:/support/callhome + * @secure + */ + getCallHomeOptionValue: (params: RequestParams = {}) => + this.request({ + path: `/support/callhome`, + method: "GET", + secure: true, + format: "json", + ...params, + }), + + /** + * No description + * + * @tags Support + * @name SetCallHomeStatus + * @summary Sets callhome status + * @request PUT:/support/callhome + * @secure + */ + setCallHomeStatus: (body: CallHomeSetStatus, params: RequestParams = {}) => + this.request({ + path: `/support/callhome`, + method: "PUT", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }), + }; +} diff --git a/portal-ui/src/api/errors.ts b/portal-ui/src/api/errors.ts new file mode 100644 index 000000000..ca11ac335 --- /dev/null +++ b/portal-ui/src/api/errors.ts @@ -0,0 +1,35 @@ +// This file is part of MinIO Console Server +// Copyright (c) 2023 MinIO, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import { ErrorResponseHandler } from "../common/types"; +import { Error } from "./consoleApi"; + +// errorToHandler translates a swagger error to a ErrorResponseHandler which +// is legacy, when all API calls are using the swagger API, we can remove this. +export const errorToHandler = (e: Error): ErrorResponseHandler => { + if (!e) { + return { + statusCode: 0, + errorMessage: "", + detailedError: "", + }; + } + return { + statusCode: e.code, + errorMessage: e.message, + detailedError: e.detailedMessage, + }; +}; diff --git a/portal-ui/src/api/index.ts b/portal-ui/src/api/index.ts new file mode 100644 index 000000000..992f56f8e --- /dev/null +++ b/portal-ui/src/api/index.ts @@ -0,0 +1,38 @@ +import { Api, HttpResponse, Error, FullRequestParams } from "./consoleApi"; + +export let api = new Api(); +const internalRequestFunc = api.request; +api.request = async ({ + body, + secure, + path, + type, + query, + format, + baseUrl, + cancelToken, + ...params +}: FullRequestParams): Promise> => { + const internalResp = internalRequestFunc({ + body, + secure, + path, + type, + query, + format, + baseUrl, + cancelToken, + ...params, + }); + return internalResp.then(CommonAPIValidation); +}; + +export function CommonAPIValidation( + res: HttpResponse +): HttpResponse { + const err = res.error as Error; + if (err && err.code === 403 && err.message === "invalid session") { + document.location = "/"; + } + return res; +} diff --git a/portal-ui/src/screens/Console/Buckets/BucketDetails/AccessDetailsPanel.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/AccessDetailsPanel.tsx index 30034c12e..7b39b6dd0 100644 --- a/portal-ui/src/screens/Console/Buckets/BucketDetails/AccessDetailsPanel.tsx +++ b/portal-ui/src/screens/Console/Buckets/BucketDetails/AccessDetailsPanel.tsx @@ -22,7 +22,6 @@ import Tabs from "@mui/material/Tabs"; import Tab from "@mui/material/Tab"; import { TabPanel } from "../../../shared/tabs"; -import { Policy } from "../../Policies/types"; import { User } from "../../Users/types"; import { ErrorResponseHandler } from "../../../../common/types"; import TableWrapper from "../../Common/TableWrapper/TableWrapper"; @@ -41,6 +40,7 @@ import { encodeURLString } from "../../../../common/utils"; import { setErrorSnackMessage } from "../../../../systemSlice"; import { selBucketDetailsLoading } from "./bucketDetailsSlice"; import { useAppDispatch } from "../../../../store"; +import { Policy } from "../../../../api/consoleApi"; function a11yProps(index: any) { return { diff --git a/portal-ui/src/screens/Console/Buckets/ListBuckets/AddBucket/AddBucket.tsx b/portal-ui/src/screens/Console/Buckets/ListBuckets/AddBucket/AddBucket.tsx index 549be6c4a..278fb5255 100644 --- a/portal-ui/src/screens/Console/Buckets/ListBuckets/AddBucket/AddBucket.tsx +++ b/portal-ui/src/screens/Console/Buckets/ListBuckets/AddBucket/AddBucket.tsx @@ -20,9 +20,10 @@ import { LinearProgress } from "@mui/material"; import { Theme } from "@mui/material/styles"; import { useNavigate } from "react-router-dom"; import { BackLink, BucketsIcon, Button, HelpBox, InfoIcon } from "mds"; -import createStyles from "@mui/styles/createStyles"; -import withStyles from "@mui/styles/withStyles"; -import { containerForHeader } from "../../../Common/FormComponents/common/styleLibrary"; +import { + containerForHeader, + modalBasic, +} from "../../../Common/FormComponents/common/styleLibrary"; import InputBoxWrapper from "../../../Common/FormComponents/InputBoxWrapper/InputBoxWrapper"; import RadioGroupSelector from "../../../Common/FormComponents/RadioGroupSelector/RadioGroupSelector"; import { k8sScalarUnitsExcluding } from "../../../../../common/utils"; @@ -34,9 +35,6 @@ import { selSiteRep, setErrorSnackMessage, } from "../../../../../systemSlice"; -import { ErrorResponseHandler } from "../../../../../common/types"; -import { BucketList } from "../../types"; -import api from "../../../../../common/api"; import PageLayout from "../../../Common/Layout/PageLayout"; import InputUnitMenu from "../../../Common/FormComponents/InputUnitMenu/InputUnitMenu"; import FormLayout from "../../../Common/FormLayout"; @@ -65,52 +63,57 @@ import { import { hasPermission } from "../../../../../common/SecureComponent"; import BucketNamingRules from "./BucketNamingRules"; import PageHeaderWrapper from "../../../Common/PageHeaderWrapper/PageHeaderWrapper"; +import { api } from "../../../../../api"; +import { + Error, + HttpResponse, + ListBucketsResponse, +} from "../../../../../api/consoleApi"; +import { errorToHandler } from "../../../../../api/errors"; +import makeStyles from "@mui/styles/makeStyles"; -const styles = (theme: Theme) => - createStyles({ - buttonContainer: { - marginTop: 24, - display: "flex", - justifyContent: "flex-end", - "& button": { - marginLeft: 8, - }, +const useStyles = makeStyles((theme: Theme) => ({ + buttonContainer: { + marginTop: 24, + display: "flex", + justifyContent: "flex-end", + "& button": { + marginLeft: 8, }, - error: { - color: "#b53b4b", - border: "1px solid #b53b4b", - padding: 8, - borderRadius: 3, + }, + error: { + color: "#b53b4b", + border: "1px solid #b53b4b", + padding: 8, + borderRadius: 3, + }, + alertVersioning: { + border: "#E2E2E2 1px solid", + backgroundColor: "#FBFAFA", + borderRadius: 3, + display: "flex", + alignItems: "center", + padding: "10px", + color: "#767676", + "& > .min-icon ": { + width: 20, + height: 20, + marginRight: 10, }, - alertVersioning: { - border: "#E2E2E2 1px solid", - backgroundColor: "#FBFAFA", - borderRadius: 3, - display: "flex", - alignItems: "center", - padding: "10px", - color: "#767676", - "& > .min-icon ": { - width: 20, - height: 20, - marginRight: 10, - }, - }, - h6title: { - fontWeight: "bold", - color: "#000000", - fontSize: 20, - }, - ...containerForHeader, - }); + }, + h6title: { + fontWeight: "bold", + color: "#000000", + fontSize: 20, + }, + ...containerForHeader, + ...modalBasic, +})); -interface IsetProps { - classes: any; -} - -const AddBucket = ({ classes }: IsetProps) => { +const AddBucket = () => { const dispatch = useAppDispatch(); const navigate = useNavigate(); + const classes = useStyles(); const validBucketCharacters = new RegExp( `^[a-z0-9][a-z0-9\\.\\-]{1,61}[a-z0-9]$` @@ -195,19 +198,23 @@ const AddBucket = ({ classes }: IsetProps) => { dispatch(setName("")); dispatch(setIsDirty(false)); const fetchRecords = () => { - api - .invoke("GET", `/api/v1/buckets`) - .then((res: BucketList) => { - var bucketList: string[] = []; - if (res.buckets != null && res.buckets.length > 0) { - res.buckets.forEach((bucket) => { - bucketList.push(bucket.name); - }); + api.buckets + .listBuckets() + .then((res: HttpResponse) => { + if (res.data) { + var bucketList: string[] = []; + if (res.data.buckets != null && res.data.buckets.length > 0) { + res.data.buckets.forEach((bucket) => { + bucketList.push(bucket.name); + }); + } + setRecords(bucketList); + } else if (res.error) { + dispatch(setErrorSnackMessage(errorToHandler(res.error))); } - setRecords(bucketList); }) - .catch((err: ErrorResponseHandler) => { - dispatch(setErrorSnackMessage(err)); + .catch((err) => { + dispatch(setErrorSnackMessage(errorToHandler(err))); }); }; fetchRecords(); @@ -544,4 +551,4 @@ const AddBucket = ({ classes }: IsetProps) => { ); }; -export default withStyles(styles)(AddBucket); +export default AddBucket; diff --git a/portal-ui/src/screens/Console/Buckets/ListBuckets/AddBucket/addBucketThunks.ts b/portal-ui/src/screens/Console/Buckets/ListBuckets/AddBucket/addBucketThunks.ts index 29e74c47b..4fb1f2e6e 100644 --- a/portal-ui/src/screens/Console/Buckets/ListBuckets/AddBucket/addBucketThunks.ts +++ b/portal-ui/src/screens/Console/Buckets/ListBuckets/AddBucket/addBucketThunks.ts @@ -14,14 +14,15 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { MakeBucketRequest } from "../../types"; import { getBytes } from "../../../../../common/utils"; -import api from "../../../../../common/api"; -import { ErrorResponseHandler } from "../../../../../common/types"; -import { setErrorSnackMessage } from "../../../../../systemSlice"; import { createAsyncThunk } from "@reduxjs/toolkit"; import { AppState } from "../../../../../store"; -import { resetForm } from "./addBucketsSlice"; +import { api } from "../../../../../api"; +import { + MakeBucketRequest, + ObjectRetentionMode, + ObjectRetentionUnit, +} from "../../../../../api/consoleApi"; export const addBucketAsync = createAsyncThunk( "buckets/addBucketAsync", @@ -62,23 +63,13 @@ export const addBucketAsync = createAsyncThunk( if (retentionEnabled) { request.retention = { - mode: retentionMode, - unit: retentionUnit, + mode: retentionMode as ObjectRetentionMode, + unit: retentionUnit as ObjectRetentionUnit, validity: retentionValidity, }; } } - return api - .invoke("POST", "/api/v1/buckets", request) - .then((res) => { - const newBucketName = `${bucketName}`; - dispatch(resetForm()); - return newBucketName; - }) - .catch((err: ErrorResponseHandler) => { - dispatch(setErrorSnackMessage(err)); - return rejectWithValue(err); - }); + return api.buckets.makeBucket(request); } ); diff --git a/portal-ui/src/screens/Console/Buckets/ListBuckets/BucketListItem.tsx b/portal-ui/src/screens/Console/Buckets/ListBuckets/BucketListItem.tsx index 646768534..d683b562b 100644 --- a/portal-ui/src/screens/Console/Buckets/ListBuckets/BucketListItem.tsx +++ b/portal-ui/src/screens/Console/Buckets/ListBuckets/BucketListItem.tsx @@ -18,7 +18,6 @@ import get from "lodash/get"; import { Theme } from "@mui/material/styles"; import createStyles from "@mui/styles/createStyles"; import { BucketsIcon, ReportedUsageIcon, TotalObjectsIcon } from "mds"; -import { Bucket } from "../types"; import { Box, Grid, Typography } from "@mui/material"; import { calculateBytes, @@ -34,6 +33,7 @@ import { import { hasPermission } from "../../../../common/SecureComponent"; import clsx from "clsx"; import makeStyles from "@mui/styles/makeStyles"; +import { Bucket } from "../../../../api/consoleApi"; const useStyles = makeStyles((theme: Theme) => createStyles({ @@ -248,7 +248,10 @@ const BucketListItem = ({ - Created: {new Date(bucket.creation_date).toString()} + Created:{" "} + {bucket.creation_date + ? new Date(bucket.creation_date).toString() + : "n/a"} diff --git a/portal-ui/src/screens/Console/Buckets/ListBuckets/ListBuckets.tsx b/portal-ui/src/screens/Console/Buckets/ListBuckets/ListBuckets.tsx index 8911bccbf..3f780baf0 100644 --- a/portal-ui/src/screens/Console/Buckets/ListBuckets/ListBuckets.tsx +++ b/portal-ui/src/screens/Console/Buckets/ListBuckets/ListBuckets.tsx @@ -29,17 +29,14 @@ import { SelectAllIcon, SelectMultipleIcon, } from "mds"; -import createStyles from "@mui/styles/createStyles"; -import withStyles from "@mui/styles/withStyles"; import { LinearProgress } from "@mui/material"; import Grid from "@mui/material/Grid"; -import { Bucket, BucketList } from "../types"; import { + actionsTray, containerForHeader, searchField, } from "../../Common/FormComponents/common/styleLibrary"; -import { ErrorResponseHandler } from "../../../../common/types"; -import api from "../../../../common/api"; + import BucketListItem from "./BucketListItem"; import BulkReplicationModal from "./BulkReplicationModal"; import { SecureComponent } from "../../../../common/SecureComponent"; @@ -65,33 +62,39 @@ import TooltipWrapper from "../../Common/TooltipWrapper/TooltipWrapper"; import AButton from "../../Common/AButton/AButton"; import { setLoadingObjects } from "../../ObjectBrowser/objectBrowserSlice"; import PageHeaderWrapper from "../../Common/PageHeaderWrapper/PageHeaderWrapper"; +import makeStyles from "@mui/styles/makeStyles"; +import { api } from "../../../../api"; +import { + Bucket, + Error, + HttpResponse, + ListBucketsResponse, +} from "../../../../api/consoleApi"; +import { errorToHandler } from "../../../../api/errors"; -const styles = (theme: Theme) => - createStyles({ - bucketList: { - marginTop: 25, - height: "calc(100vh - 211px)", - "&.isEmbedded": { - height: "calc(100vh - 128px)", - }, +const useStyles = makeStyles((theme: Theme) => ({ + bucketList: { + marginTop: 25, + height: "calc(100vh - 211px)", + "&.isEmbedded": { + height: "calc(100vh - 128px)", }, - searchField: { - ...searchField.searchField, - minWidth: 380, - "@media (max-width: 900px)": { - minWidth: 220, - }, + }, + searchField: { + ...searchField.searchField, + minWidth: 380, + "@media (max-width: 900px)": { + minWidth: 220, }, - ...containerForHeader, - }); + }, + ...containerForHeader, + ...actionsTray, +})); -interface IListBucketsProps { - classes: any; -} - -const ListBuckets = ({ classes }: IListBucketsProps) => { +const ListBuckets = () => { const dispatch = useAppDispatch(); const navigate = useNavigate(); + const classes = useStyles(); const [records, setRecords] = useState([]); const [loading, setLoading] = useState(true); @@ -110,16 +113,17 @@ const ListBuckets = ({ classes }: IListBucketsProps) => { if (loading) { const fetchRecords = () => { setLoading(true); - api - .invoke("GET", `/api/v1/buckets`) - .then((res: BucketList) => { - setLoading(false); - setRecords(res.buckets || []); - dispatch(setLoadingObjects(true)); - }) - .catch((err: ErrorResponseHandler) => { - setLoading(false); - dispatch(setErrorSnackMessage(err)); + api.buckets + .listBuckets() + .then((res: HttpResponse) => { + if (res.data) { + setLoading(false); + setRecords(res.data.buckets || []); + dispatch(setLoadingObjects(true)); + } else if (res.error) { + setLoading(false); + dispatch(setErrorSnackMessage(errorToHandler(res.error))); + } }); }; fetchRecords(); @@ -483,4 +487,4 @@ const ListBuckets = ({ classes }: IListBucketsProps) => { ); }; -export default withStyles(styles)(ListBuckets); +export default ListBuckets; diff --git a/portal-ui/src/screens/Console/Buckets/types.tsx b/portal-ui/src/screens/Console/Buckets/types.tsx index 1f43ad748..d9bbf5cb1 100644 --- a/portal-ui/src/screens/Console/Buckets/types.tsx +++ b/portal-ui/src/screens/Console/Buckets/types.tsx @@ -14,21 +14,6 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -export interface RwAccess { - write: boolean; - read: boolean; -} - -export interface Bucket { - name: string; - creation_date: string; - size?: number; - objects?: number; - rw_access?: RwAccess; - manage?: boolean; - details?: Details; -} - export interface BucketEncryptionInfo { algorithm: string; kmsMasterKeyID: string; @@ -50,11 +35,6 @@ export interface BucketInfo { size?: number; } -export interface BucketList { - buckets: Bucket[]; - total: number; -} - export interface BucketEvent { id: string; arn: string; @@ -68,11 +48,6 @@ export interface BucketEventList { total: number; } -export interface BucketPolicy { - name: string; - body: string; -} - export interface ArnList { arns: string[]; } @@ -92,10 +67,6 @@ export interface BucketObjectLocking { object_locking_enabled: boolean; } -export interface BucketReplicationRuleDeleteMarker { - status: string; -} - export interface BucketReplicationDestination { bucket: string; } @@ -124,26 +95,6 @@ export interface BucketQuota { type: string; } -export interface QuotaRequest { - enabled: boolean; - quota_type: string; - amount: number; -} - -export interface RetentionRequest { - mode: string; - unit: string; - validity: number; -} - -export interface MakeBucketRequest { - name: string; - versioning: boolean; - locking: boolean; - quota?: QuotaRequest; - retention?: RetentionRequest; -} - export interface ChangePasswordRequest { current_secret_key: string; new_secret_key: string; @@ -154,27 +105,6 @@ export interface ChangeUserPasswordRequest { newSecretKey: string; } -export interface IRemoteBucket { - name: string; - accessKey: string; - secretKey: string; - sourceBucket: string; - targetURL: string; - targetBucket: string; - remoteARN: string; - status: string; - service: string; -} - -export interface PermissionAction { - id: string; - can: boolean; -} - -export interface HasPermissionResponse { - permissions: PermissionAction[]; -} - export interface BulkReplicationResponse { replicationState: BulkReplicationItem[]; } diff --git a/portal-ui/src/screens/Console/CommandBar.tsx b/portal-ui/src/screens/Console/CommandBar.tsx index 1788a2bd0..069db7eeb 100644 --- a/portal-ui/src/screens/Console/CommandBar.tsx +++ b/portal-ui/src/screens/Console/CommandBar.tsx @@ -36,9 +36,14 @@ import { routesAsKbarActions } from "./kbar-actions"; import { Box } from "@mui/material"; import { MenuExpandedIcon } from "mds"; import { useSelector } from "react-redux"; -import useApi from "./Common/Hooks/useApi"; -import { Bucket, BucketList } from "./Buckets/types"; import { selFeatures } from "./consoleSlice"; +import { + Bucket, + Error, + HttpResponse, + ListBucketsResponse, +} from "../../api/consoleApi"; +import { api } from "../../api"; const useStyles = makeStyles((theme: Theme) => ({ resultItem: { @@ -131,15 +136,18 @@ const CommandBar = () => { const [buckets, setBuckets] = useState([]); - const [, invokeListBucketsApi] = useApi( - (res: BucketList) => { - setBuckets(res.buckets); - }, - () => {} - ); + const invokeListBucketsApi = () => { + api.buckets + .listBuckets() + .then((res: HttpResponse) => { + if (res.data !== undefined) { + setBuckets(res.data.buckets || []); + } + }); + }; const fetchBuckets = useCallback(() => { - invokeListBucketsApi("GET", `/api/v1/buckets`); + invokeListBucketsApi(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); diff --git a/portal-ui/src/screens/Console/ObjectBrowser/OBBucketList.tsx b/portal-ui/src/screens/Console/ObjectBrowser/OBBucketList.tsx index f2867d31b..7de77642d 100644 --- a/portal-ui/src/screens/Console/ObjectBrowser/OBBucketList.tsx +++ b/portal-ui/src/screens/Console/ObjectBrowser/OBBucketList.tsx @@ -22,14 +22,11 @@ import { BucketsIcon, Button, HelpBox, RefreshIcon } from "mds"; import createStyles from "@mui/styles/createStyles"; import { LinearProgress } from "@mui/material"; import Grid from "@mui/material/Grid"; -import { Bucket, BucketList } from "../Buckets/types"; import { actionsTray, containerForHeader, searchField, } from "../Common/FormComponents/common/styleLibrary"; -import { ErrorResponseHandler } from "../../../common/types"; -import api from "../../../common/api"; import { SecureComponent } from "../../../common/SecureComponent"; import { @@ -48,11 +45,19 @@ import { selFeatures } from "../consoleSlice"; import AutoColorIcon from "../Common/Components/AutoColorIcon"; import TooltipWrapper from "../Common/TooltipWrapper/TooltipWrapper"; import AButton from "../Common/AButton/AButton"; -import { setLoadingObjects } from "../ObjectBrowser/objectBrowserSlice"; import makeStyles from "@mui/styles/makeStyles"; import TableWrapper from "../Common/TableWrapper/TableWrapper"; import { niceBytesInt } from "../../../common/utils"; import PageHeaderWrapper from "../Common/PageHeaderWrapper/PageHeaderWrapper"; +import { + Bucket, + HttpResponse, + ListBucketsResponse, + Error, +} from "../../../api/consoleApi"; +import { api } from "../../../api"; +import { errorToHandler } from "../../../api/errors"; +import { setLoadingObjects } from "./objectBrowserSlice"; const useStyles = makeStyles((theme: Theme) => createStyles({ @@ -91,16 +96,18 @@ const OBListBuckets = () => { if (loading) { const fetchRecords = () => { setLoading(true); - api - .invoke("GET", `/api/v1/buckets`) - .then((res: BucketList) => { - setLoading(false); - setRecords(res.buckets || []); - dispatch(setLoadingObjects(true)); + api.buckets + .listBuckets() + .then((res: HttpResponse) => { + if (res.data) { + setLoading(false); + setRecords(res.data.buckets || []); + dispatch(setLoadingObjects(true)); + } }) - .catch((err: ErrorResponseHandler) => { + .catch((err) => { setLoading(false); - dispatch(setErrorSnackMessage(err)); + dispatch(setErrorSnackMessage(errorToHandler(err))); }); }; fetchRecords(); diff --git a/portal-ui/src/screens/Console/Policies/AddPolicyScreen.tsx b/portal-ui/src/screens/Console/Policies/AddPolicyScreen.tsx index 40be99a02..137983bbb 100644 --- a/portal-ui/src/screens/Console/Policies/AddPolicyScreen.tsx +++ b/portal-ui/src/screens/Console/Policies/AddPolicyScreen.tsx @@ -24,13 +24,14 @@ import AddPolicyHelpBox from "./AddPolicyHelpBox"; import CodeMirrorWrapper from "../Common/FormComponents/CodeMirrorWrapper/CodeMirrorWrapper"; import { IAM_PAGES } from "../../../common/SecureComponent/permissions"; import { ErrorResponseHandler } from "../../../common/types"; -import api from "../../../../src/common/api"; import FormLayout from "../Common/FormLayout"; import { setErrorSnackMessage } from "../../../systemSlice"; import { useNavigate } from "react-router-dom"; import { useAppDispatch } from "../../../store"; import { emptyPolicy } from "./utils"; import PageHeaderWrapper from "../Common/PageHeaderWrapper/PageHeaderWrapper"; +import { api } from "../../../api"; +import { Error, HttpResponse, Policy } from "../../../api/consoleApi"; const AddPolicyScreen = () => { const dispatch = useAppDispatch(); @@ -46,12 +47,12 @@ const AddPolicyScreen = () => { return; } setAddLoading(true); - api - .invoke("POST", "/api/v1/policies", { + api.policies + .addPolicy({ name: policyName, policy: policyDefinition, }) - .then((res) => { + .then((res: HttpResponse) => { setAddLoading(false); navigate(`${IAM_PAGES.POLICIES}`); }) diff --git a/portal-ui/src/screens/Console/Policies/ListPolicies.tsx b/portal-ui/src/screens/Console/Policies/ListPolicies.tsx index 7e30d500a..91d953908 100644 --- a/portal-ui/src/screens/Console/Policies/ListPolicies.tsx +++ b/portal-ui/src/screens/Console/Policies/ListPolicies.tsx @@ -17,12 +17,10 @@ import React, { Fragment, useEffect, useState } from "react"; import { AddIcon, Button, HelpBox, IAMPoliciesIcon } from "mds"; import { useNavigate } from "react-router-dom"; -import get from "lodash/get"; import { Theme } from "@mui/material/styles"; import createStyles from "@mui/styles/createStyles"; import withStyles from "@mui/styles/withStyles"; import Grid from "@mui/material/Grid"; -import { Policy, PolicyList } from "./types"; import { actionsTray, @@ -32,7 +30,6 @@ import { import { ErrorResponseHandler } from "../../../common/types"; import TableWrapper from "../Common/TableWrapper/TableWrapper"; -import api from "../../../common/api"; import PageLayout from "../Common/Layout/PageLayout"; import { CONSOLE_UI_RESOURCE, @@ -57,6 +54,13 @@ import { setErrorSnackMessage } from "../../../systemSlice"; import { useAppDispatch } from "../../../store"; import TooltipWrapper from "../Common/TooltipWrapper/TooltipWrapper"; import PageHeaderWrapper from "../Common/PageHeaderWrapper/PageHeaderWrapper"; +import { api } from "../../../api"; +import { + Error, + HttpResponse, + ListPoliciesResponse, + Policy, +} from "../../../api/consoleApi"; const DeletePolicy = withSuspense(React.lazy(() => import("./DeletePolicy"))); @@ -115,17 +119,17 @@ const ListPolicies = ({ classes }: IPoliciesProps) => { useEffect(() => { if (loading) { if (canDisplayPolicies) { - api - .invoke("GET", `/api/v1/policies`) - .then((res: PolicyList) => { - const policies = get(res, "policies", []); + api.policies + .listPolicies() + .then((res: HttpResponse) => { + const policies = res.data.policies ?? []; policies.sort((pa, pb) => { - if (pa.name > pb.name) { + if (pa.name! > pb.name!) { return 1; } - if (pa.name < pb.name) { + if (pa.name! < pb.name!) { return -1; } @@ -181,7 +185,7 @@ const ListPolicies = ({ classes }: IPoliciesProps) => { ]; const filteredRecords = records.filter((elementItem) => - elementItem.name.includes(filterPolicies) + elementItem.name?.includes(filterPolicies) ); return ( diff --git a/portal-ui/src/screens/Console/Policies/PolicyDetails.tsx b/portal-ui/src/screens/Console/Policies/PolicyDetails.tsx index 149d6815a..8d0937e18 100644 --- a/portal-ui/src/screens/Console/Policies/PolicyDetails.tsx +++ b/portal-ui/src/screens/Console/Policies/PolicyDetails.tsx @@ -14,7 +14,6 @@ // along with this program. If not, see . import React, { Fragment, useEffect, useState } from "react"; -import { IAMPolicy, IAMStatement, Policy } from "./types"; import { useSelector } from "react-redux"; import { useNavigate, useParams } from "react-router-dom"; import { @@ -38,7 +37,6 @@ import Paper from "@mui/material/Paper"; import Grid from "@mui/material/Grid"; import { LinearProgress } from "@mui/material"; import TableWrapper from "../Common/TableWrapper/TableWrapper"; -import api from "../../../common/api"; import { ErrorResponseHandler } from "../../../common/types"; import CodeMirrorWrapper from "../Common/FormComponents/CodeMirrorWrapper/CodeMirrorWrapper"; @@ -75,6 +73,14 @@ import { selFeatures } from "../consoleSlice"; import { useAppDispatch } from "../../../store"; import TooltipWrapper from "../Common/TooltipWrapper/TooltipWrapper"; import PageHeaderWrapper from "../Common/PageHeaderWrapper/PageHeaderWrapper"; +import { + Error, + HttpResponse, + Policy, + ServiceAccounts, +} from "../../../api/consoleApi"; +import { api } from "../../../api"; +import { IAMPolicy, IAMStatement } from "./types"; const DeletePolicy = withSuspense(React.lazy(() => import("./DeletePolicy"))); @@ -180,8 +186,8 @@ const PolicyDetails = ({ classes }: IPolicyDetailsProps) => { } setAddLoading(true); if (canEditPolicy) { - api - .invoke("POST", "/api/v1/policies", { + api.policies + .addPolicy({ name: policyName, policy: policyDefinition, }) @@ -203,13 +209,10 @@ const PolicyDetails = ({ classes }: IPolicyDetailsProps) => { const loadUsersForPolicy = () => { if (loadingUsers) { if (displayUsers && !ldapIsEnabled) { - api - .invoke( - "GET", - `/api/v1/policies/${encodeURLString(policyName)}/users` - ) - .then((result: any) => { - setUserList(result); + api.policies + .listUsersForPolicy(encodeURLString(policyName)) + .then((result: HttpResponse) => { + setUserList(result.data ?? []); setLoadingUsers(false); }) .catch((err: ErrorResponseHandler) => { @@ -225,13 +228,10 @@ const PolicyDetails = ({ classes }: IPolicyDetailsProps) => { const loadGroupsForPolicy = () => { if (loadingGroups) { if (displayGroups && !ldapIsEnabled) { - api - .invoke( - "GET", - `/api/v1/policies/${encodeURLString(policyName)}/groups` - ) - .then((result: any) => { - setGroupList(result); + api.policies + .listGroupsForPolicy(encodeURLString(policyName)) + .then((result: HttpResponse) => { + setGroupList(result.data ?? []); setLoadingGroups(false); }) .catch((err: ErrorResponseHandler) => { @@ -246,17 +246,17 @@ const PolicyDetails = ({ classes }: IPolicyDetailsProps) => { const loadPolicyDetails = () => { if (loadingPolicy) { if (displayPolicy) { - api - .invoke("GET", `/api/v1/policy/${encodeURLString(policyName)}`) - .then((result: any) => { - if (result) { - setPolicy(result); + api.policy + .policyInfo(encodeURLString(policyName)) + .then((result: HttpResponse) => { + if (result.data) { + setPolicy(result.data); setPolicyDefinition( result - ? JSON.stringify(JSON.parse(result.policy), null, 4) + ? JSON.stringify(JSON.parse(result.data?.policy!), null, 4) : "" ); - const pol: IAMPolicy = JSON.parse(result.policy); + const pol: IAMPolicy = JSON.parse(result.data?.policy!); setPolicyStatements(pol.Statement); } setLoadingPolicy(false); diff --git a/portal-ui/src/screens/Console/Policies/PolicySelectors.tsx b/portal-ui/src/screens/Console/Policies/PolicySelectors.tsx index 6c20ceb2b..2d64e27c8 100644 --- a/portal-ui/src/screens/Console/Policies/PolicySelectors.tsx +++ b/portal-ui/src/screens/Console/Policies/PolicySelectors.tsx @@ -28,16 +28,20 @@ import { selectorsCommon, tableStyles, } from "../Common/FormComponents/common/styleLibrary"; -import { PolicyList } from "./types"; import { ErrorResponseHandler } from "../../../common/types"; -import api from "../../../common/api"; import TableWrapper from "../Common/TableWrapper/TableWrapper"; import SearchBox from "../Common/SearchBox"; import { setModalErrorSnackMessage } from "../../../systemSlice"; import { AppState, useAppDispatch } from "../../../store"; import { setSelectedPolicies } from "../Users/AddUsersSlice"; import { useSelector } from "react-redux"; +import { api } from "../../../api"; +import { + HttpResponse, + ListPoliciesResponse, + Error, +} from "../../../api/consoleApi"; interface ISelectPolicyProps { classes: any; @@ -90,10 +94,10 @@ const PolicySelectors = ({ classes, noTitle = false }: ISelectPolicyProps) => { const fetchPolicies = useCallback(() => { isLoading(true); - api - .invoke("GET", `/api/v1/policies?limit=1000`) - .then((res: PolicyList) => { - const policies = res.policies === null ? [] : res.policies; + api.policies + .listPolicies() + .then((res: HttpResponse) => { + const policies = res.data.policies ?? []; isLoading(false); setRecords(policies.sort(policySort)); }) diff --git a/portal-ui/src/screens/Console/Policies/PolicyView.tsx b/portal-ui/src/screens/Console/Policies/PolicyView.tsx index 9da0c24b4..9ea1fcfed 100644 --- a/portal-ui/src/screens/Console/Policies/PolicyView.tsx +++ b/portal-ui/src/screens/Console/Policies/PolicyView.tsx @@ -13,25 +13,23 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import React, { useState } from "react"; -import { IAMStatement } from "./types"; +import React, { Fragment, useState } from "react"; import { Box } from "@mui/material"; import Grid from "@mui/material/Grid"; import SearchBox from "../Common/SearchBox"; import { Theme } from "@mui/material/styles"; -import createStyles from "@mui/styles/createStyles"; import { searchField } from "../Common/FormComponents/common/styleLibrary"; -import withStyles from "@mui/styles/withStyles"; import { DisabledIcon, EnabledIcon } from "mds"; import { STATUS_COLORS } from "../Dashboard/BasicDashboard/Utils"; +import makeStyles from "@mui/styles/makeStyles"; +import { IAMStatement } from "./types"; -const styles = (theme: Theme) => - createStyles({ - searchField: { - ...searchField.searchField, - maxWidth: 380, - }, - }); +const useStyles = makeStyles((theme: Theme) => ({ + searchField: { + ...searchField.searchField, + maxWidth: 380, + }, +})); const rowGridStyle = { display: "grid", @@ -57,11 +55,11 @@ const Highlight = ({ search = "", children = "" }): any => { const PolicyView = ({ policyStatements, - classes = {}, }: { policyStatements: IAMStatement[]; - classes?: any; }) => { + const classes = useStyles(); + const [filter, setFilter] = useState(""); return ( @@ -88,104 +86,107 @@ const PolicyView = ({ /> - - {policyStatements.map((stmt, i) => { - const effect = stmt.Effect; - const isAllow = effect === "Allow"; - return ( - - - Effect: - - {isAllow ? : } - {effect} - - - + {!policyStatements && Policy has no statements} + {policyStatements && ( + + {policyStatements.map((stmt, i) => { + const effect = stmt.Effect; + const isAllow = effect === "Allow"; + return ( - Actions: - - {stmt.Action && - stmt.Action.map((act, actIndex) => ( -
- {act} -
- ))} + Effect: + + {isAllow ? : } + {effect}
- - Resources: - - {stmt.Resource && - stmt.Resource.map((res, resIndex) => ( -
- {" "} - {res} -
- ))} + + + + Actions: + + {stmt.Action && + stmt.Action.map((act, actIndex) => ( +
+ {act} +
+ ))} +
+
+ + Resources: + + {stmt.Resource && + stmt.Resource.map((res, resIndex) => ( +
+ {" "} + {res} +
+ ))} +
-
- ); - })} -
+ ); + })} +
+ )}
); }; -export default withStyles(styles)(PolicyView); +export default PolicyView; diff --git a/portal-ui/src/screens/Console/Policies/types.ts b/portal-ui/src/screens/Console/Policies/types.ts index 69d42c207..12541171f 100644 --- a/portal-ui/src/screens/Console/Policies/types.ts +++ b/portal-ui/src/screens/Console/Policies/types.ts @@ -14,30 +14,12 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -export interface Policy { - name: string; - policy: string; -} - -export interface PolicyList { - policies: Policy[]; - total: number; -} - export interface IAMStatement { Effect: string; Action: string[]; Resource: string[]; } -export const newStatement = (): IAMStatement => { - return { - Effect: "Deny", - Action: [], - Resource: [], - }; -}; - export interface IAMPolicy { Version: string; Statement: IAMStatement[]; diff --git a/portal-ui/src/screens/Console/kbar-actions.tsx b/portal-ui/src/screens/Console/kbar-actions.tsx index 915e57517..c2b82a0cb 100644 --- a/portal-ui/src/screens/Console/kbar-actions.tsx +++ b/portal-ui/src/screens/Console/kbar-actions.tsx @@ -18,7 +18,7 @@ import { Action } from "kbar/lib/types"; import { BucketsIcon } from "mds"; import { validRoutes } from "./valid-routes"; import { IAM_PAGES } from "../../common/SecureComponent/permissions"; -import { Bucket } from "./Buckets/types"; +import { Bucket } from "../../api/consoleApi"; export const routesAsKbarActions = ( features: string[] | null, diff --git a/portal-ui/src/utils/sortFunctions.ts b/portal-ui/src/utils/sortFunctions.ts index ee5cb5d4f..55183472b 100644 --- a/portal-ui/src/utils/sortFunctions.ts +++ b/portal-ui/src/utils/sortFunctions.ts @@ -14,16 +14,13 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +import { Policy } from "../api/consoleApi"; import { redirectRule } from "../screens/LoginPage/types"; interface userInterface { accessKey: string; } -interface policyInterface { - name: string; -} - interface policyDetailsInterface { policy: string; } @@ -39,11 +36,11 @@ export const usersSort = (a: userInterface, b: userInterface) => { return 0; }; -export const policySort = (a: policyInterface, b: policyInterface) => { - if (a.name > b.name) { +export const policySort = (a: Policy, b: Policy) => { + if (a.name! > b.name!) { return 1; } - if (a.name < b.name) { + if (a.name! < b.name!) { return -1; } // a must be equal to b