Skip to content
Snippets Groups Projects
Verified Commit 96df9598 authored by Daniel Göbel's avatar Daniel Göbel
Browse files

Migrate t new service architecture of CloWM

#32
parent 9aabe703
No related branches found
No related tags found
2 merge requests!84Remove development branch,!27Resolve "Migrate to new service architecture"
Showing
with 682 additions and 14 deletions
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { RoleEnum } from '../models/RoleEnum';
import type { User } from '../models/User';
import type { CancelablePromise } from '../core/CancelablePromise';
import { OpenAPI } from '../core/OpenAPI';
import { request as __request } from '../core/request';
export class UserService {
/**
* Get the logged in user
* Return the user associated with the used JWT.
* @returns User Successful Response
* @throws ApiError
*/
public static userGetLoggedInUser(): CancelablePromise<User> {
return __request(OpenAPI, {
method: 'GET',
url: '/users/me',
errors: {
400: `Error decoding JWT Token`,
403: `Not Authorized`,
404: `Entity not Found`,
},
});
}
/**
* List users and search by their name
* Return the users that have a specific substring in their name.
* @param nameSubstring Filter users by a substring in their name. Permission 'search_user' required
* @param filterRoles Filter users by their role. If multiple are selected, they are concatenating by an OR Expresssion. Permission 'read_any' required
* @param includeRole Flag whether to include the roles of the users in the response. If True, permission 'read_any' required.
* @returns User Successful Response
* @throws ApiError
*/
public static userListUsers(
nameSubstring?: string,
filterRoles?: Array<RoleEnum>,
includeRole: boolean = false,
): CancelablePromise<Array<User>> {
return __request(OpenAPI, {
method: 'GET',
url: '/users',
query: {
'name_substring': nameSubstring,
'filter_roles': filterRoles,
'include_role': includeRole,
},
errors: {
400: `Error decoding JWT Token`,
403: `Not Authorized`,
404: `Entity not Found`,
422: `Validation Error`,
},
});
}
/**
* Get a user by its uid
* Return the user with the specific uid. A user can only view himself.
* @param uid UID of a user
* @returns User Successful Response
* @throws ApiError
*/
public static userGetUser(
uid: string,
): CancelablePromise<User> {
return __request(OpenAPI, {
method: 'GET',
url: '/users/{uid}',
path: {
'uid': uid,
},
errors: {
400: `Error decoding JWT Token`,
403: `Not Authorized`,
404: `Entity not Found`,
422: `Validation Error`,
},
});
}
}
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { ApiRequestOptions } from './ApiRequestOptions';
import type { ApiResult } from './ApiResult';
export class ApiError extends Error {
public readonly url: string;
public readonly status: number;
public readonly statusText: string;
public readonly body: any;
public readonly request: ApiRequestOptions;
constructor(request: ApiRequestOptions, response: ApiResult, message: string) {
super(message);
this.name = 'ApiError';
this.url = response.url;
this.status = response.status;
this.statusText = response.statusText;
this.body = response.body;
this.request = request;
}
}
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiRequestOptions = {
readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH';
readonly url: string;
readonly path?: Record<string, any>;
readonly cookies?: Record<string, any>;
readonly headers?: Record<string, any>;
readonly query?: Record<string, any>;
readonly formData?: Record<string, any>;
readonly body?: any;
readonly mediaType?: string;
readonly responseHeader?: string;
readonly errors?: Record<number, string>;
};
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResult = {
readonly url: string;
readonly ok: boolean;
readonly status: number;
readonly statusText: string;
readonly body: any;
};
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export class CancelError extends Error {
constructor(message: string) {
super(message);
this.name = 'CancelError';
}
public get isCancelled(): boolean {
return true;
}
}
export interface OnCancel {
readonly isResolved: boolean;
readonly isRejected: boolean;
readonly isCancelled: boolean;
(cancelHandler: () => void): void;
}
export class CancelablePromise<T> implements Promise<T> {
readonly [Symbol.toStringTag]!: string;
private _isResolved: boolean;
private _isRejected: boolean;
private _isCancelled: boolean;
private readonly _cancelHandlers: (() => void)[];
private readonly _promise: Promise<T>;
private _resolve?: (value: T | PromiseLike<T>) => void;
private _reject?: (reason?: any) => void;
constructor(
executor: (
resolve: (value: T | PromiseLike<T>) => void,
reject: (reason?: any) => void,
onCancel: OnCancel
) => void
) {
this._isResolved = false;
this._isRejected = false;
this._isCancelled = false;
this._cancelHandlers = [];
this._promise = new Promise<T>((resolve, reject) => {
this._resolve = resolve;
this._reject = reject;
const onResolve = (value: T | PromiseLike<T>): void => {
if (this._isResolved || this._isRejected || this._isCancelled) {
return;
}
this._isResolved = true;
this._resolve?.(value);
};
const onReject = (reason?: any): void => {
if (this._isResolved || this._isRejected || this._isCancelled) {
return;
}
this._isRejected = true;
this._reject?.(reason);
};
const onCancel = (cancelHandler: () => void): void => {
if (this._isResolved || this._isRejected || this._isCancelled) {
return;
}
this._cancelHandlers.push(cancelHandler);
};
Object.defineProperty(onCancel, 'isResolved', {
get: (): boolean => this._isResolved,
});
Object.defineProperty(onCancel, 'isRejected', {
get: (): boolean => this._isRejected,
});
Object.defineProperty(onCancel, 'isCancelled', {
get: (): boolean => this._isCancelled,
});
return executor(onResolve, onReject, onCancel as OnCancel);
});
}
public then<TResult1 = T, TResult2 = never>(
onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,
onRejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null
): Promise<TResult1 | TResult2> {
return this._promise.then(onFulfilled, onRejected);
}
public catch<TResult = never>(
onRejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null
): Promise<T | TResult> {
return this._promise.catch(onRejected);
}
public finally(onFinally?: (() => void) | null): Promise<T> {
return this._promise.finally(onFinally);
}
public cancel(): void {
if (this._isResolved || this._isRejected || this._isCancelled) {
return;
}
this._isCancelled = true;
if (this._cancelHandlers.length) {
try {
for (const cancelHandler of this._cancelHandlers) {
cancelHandler();
}
} catch (error) {
console.warn('Cancellation threw an error', error);
return;
}
}
this._cancelHandlers.length = 0;
this._reject?.(new CancelError('Request aborted'));
}
public get isCancelled(): boolean {
return this._isCancelled;
}
}
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { ApiRequestOptions } from './ApiRequestOptions';
type Resolver<T> = (options: ApiRequestOptions) => Promise<T>;
type Headers = Record<string, string>;
export type OpenAPIConfig = {
BASE: string;
VERSION: string;
WITH_CREDENTIALS: boolean;
CREDENTIALS: 'include' | 'omit' | 'same-origin';
TOKEN?: string | Resolver<string>;
USERNAME?: string | Resolver<string>;
PASSWORD?: string | Resolver<string>;
HEADERS?: Headers | Resolver<Headers>;
ENCODE_PATH?: (path: string) => string;
};
export const OpenAPI: OpenAPIConfig = {
BASE: '/api/s3proxy-service',
VERSION: '2.0.0',
WITH_CREDENTIALS: false,
CREDENTIALS: 'include',
TOKEN: undefined,
USERNAME: undefined,
PASSWORD: undefined,
HEADERS: undefined,
ENCODE_PATH: undefined,
};
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import axios from 'axios';
import type { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';
import FormData from 'form-data';
import { ApiError } from './ApiError';
import type { ApiRequestOptions } from './ApiRequestOptions';
import type { ApiResult } from './ApiResult';
import { CancelablePromise } from './CancelablePromise';
import type { OnCancel } from './CancelablePromise';
import type { OpenAPIConfig } from './OpenAPI';
const isDefined = <T>(value: T | null | undefined): value is Exclude<T, null | undefined> => {
return value !== undefined && value !== null;
};
const isString = (value: any): value is string => {
return typeof value === 'string';
};
const isStringWithValue = (value: any): value is string => {
return isString(value) && value !== '';
};
const isBlob = (value: any): value is Blob => {
return (
typeof value === 'object' &&
typeof value.type === 'string' &&
typeof value.stream === 'function' &&
typeof value.arrayBuffer === 'function' &&
typeof value.constructor === 'function' &&
typeof value.constructor.name === 'string' &&
/^(Blob|File)$/.test(value.constructor.name) &&
/^(Blob|File)$/.test(value[Symbol.toStringTag])
);
};
const isFormData = (value: any): value is FormData => {
return value instanceof FormData;
};
const isSuccess = (status: number): boolean => {
return status >= 200 && status < 300;
};
const base64 = (str: string): string => {
try {
return btoa(str);
} catch (err) {
// @ts-ignore
return Buffer.from(str).toString('base64');
}
};
const getQueryString = (params: Record<string, any>): string => {
const qs: string[] = [];
const append = (key: string, value: any) => {
qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);
};
const process = (key: string, value: any) => {
if (isDefined(value)) {
if (Array.isArray(value)) {
value.forEach(v => {
process(key, v);
});
} else if (typeof value === 'object') {
Object.entries(value).forEach(([k, v]) => {
process(`${key}[${k}]`, v);
});
} else {
append(key, value);
}
}
};
Object.entries(params).forEach(([key, value]) => {
process(key, value);
});
if (qs.length > 0) {
return `?${qs.join('&')}`;
}
return '';
};
const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => {
const encoder = config.ENCODE_PATH || encodeURI;
const path = options.url
.replace('{api-version}', config.VERSION)
.replace(/{(.*?)}/g, (substring: string, group: string) => {
if (options.path?.hasOwnProperty(group)) {
return encoder(String(options.path[group]));
}
return substring;
});
const url = `${config.BASE}${path}`;
if (options.query) {
return `${url}${getQueryString(options.query)}`;
}
return url;
};
const getFormData = (options: ApiRequestOptions): FormData | undefined => {
if (options.formData) {
const formData = new FormData();
const process = (key: string, value: any) => {
if (isString(value) || isBlob(value)) {
formData.append(key, value);
} else {
formData.append(key, JSON.stringify(value));
}
};
Object.entries(options.formData)
.filter(([_, value]) => isDefined(value))
.forEach(([key, value]) => {
if (Array.isArray(value)) {
value.forEach(v => process(key, v));
} else {
process(key, value);
}
});
return formData;
}
return undefined;
};
type Resolver<T> = (options: ApiRequestOptions) => Promise<T>;
const resolve = async <T>(options: ApiRequestOptions, resolver?: T | Resolver<T>): Promise<T | undefined> => {
if (typeof resolver === 'function') {
return (resolver as Resolver<T>)(options);
}
return resolver;
};
const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions, formData?: FormData): Promise<Record<string, string>> => {
const token = await resolve(options, config.TOKEN);
const username = await resolve(options, config.USERNAME);
const password = await resolve(options, config.PASSWORD);
const additionalHeaders = await resolve(options, config.HEADERS);
const formHeaders = typeof formData?.getHeaders === 'function' && formData?.getHeaders() || {}
const headers = Object.entries({
Accept: 'application/json',
...additionalHeaders,
...options.headers,
...formHeaders,
})
.filter(([_, value]) => isDefined(value))
.reduce((headers, [key, value]) => ({
...headers,
[key]: String(value),
}), {} as Record<string, string>);
if (isStringWithValue(token)) {
headers['Authorization'] = `Bearer ${token}`;
}
if (isStringWithValue(username) && isStringWithValue(password)) {
const credentials = base64(`${username}:${password}`);
headers['Authorization'] = `Basic ${credentials}`;
}
if (options.body) {
if (options.mediaType) {
headers['Content-Type'] = options.mediaType;
} else if (isBlob(options.body)) {
headers['Content-Type'] = options.body.type || 'application/octet-stream';
} else if (isString(options.body)) {
headers['Content-Type'] = 'text/plain';
} else if (!isFormData(options.body)) {
headers['Content-Type'] = 'application/json';
}
}
return headers;
};
const getRequestBody = (options: ApiRequestOptions): any => {
if (options.body) {
return options.body;
}
return undefined;
};
const sendRequest = async <T>(
config: OpenAPIConfig,
options: ApiRequestOptions,
url: string,
body: any,
formData: FormData | undefined,
headers: Record<string, string>,
onCancel: OnCancel
): Promise<AxiosResponse<T>> => {
const source = axios.CancelToken.source();
const requestConfig: AxiosRequestConfig = {
url,
headers,
data: body ?? formData,
method: options.method,
withCredentials: config.WITH_CREDENTIALS,
cancelToken: source.token,
};
onCancel(() => source.cancel('The user aborted a request.'));
try {
return await axios.request(requestConfig);
} catch (error) {
const axiosError = error as AxiosError<T>;
if (axiosError.response) {
return axiosError.response;
}
throw error;
}
};
const getResponseHeader = (response: AxiosResponse<any>, responseHeader?: string): string | undefined => {
if (responseHeader) {
const content = response.headers[responseHeader];
if (isString(content)) {
return content;
}
}
return undefined;
};
const getResponseBody = (response: AxiosResponse<any>): any => {
if (response.status !== 204) {
return response.data;
}
return undefined;
};
const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => {
const errors: Record<number, string> = {
400: 'Bad Request',
401: 'Unauthorized',
403: 'Forbidden',
404: 'Not Found',
500: 'Internal Server Error',
502: 'Bad Gateway',
503: 'Service Unavailable',
...options.errors,
}
const error = errors[result.status];
if (error) {
throw new ApiError(options, result, error);
}
if (!result.ok) {
throw new ApiError(options, result, 'Generic Error');
}
};
/**
* Request method
* @param config The OpenAPI configuration object
* @param options The request options from the service
* @returns CancelablePromise<T>
* @throws ApiError
*/
export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise<T> => {
return new CancelablePromise(async (resolve, reject, onCancel) => {
try {
const url = getUrl(config, options);
const formData = getFormData(options);
const body = getRequestBody(options);
const headers = await getHeaders(config, options, formData);
if (!onCancel.isCancelled) {
const response = await sendRequest<T>(config, options, url, body, formData, headers, onCancel);
const responseBody = getResponseBody(response);
const responseHeader = getResponseHeader(response, options.responseHeader);
const result: ApiResult = {
url,
ok: isSuccess(response.status),
status: response.status,
statusText: response.statusText,
body: responseHeader ?? responseBody,
};
catchErrorCodes(options, result);
resolve(result.body);
}
} catch (error) {
reject(error);
}
});
};
......@@ -11,18 +11,17 @@ export type { BucketOut } from './models/BucketOut';
export type { BucketPermissionIn } from './models/BucketPermissionIn';
export type { BucketPermissionOut } from './models/BucketPermissionOut';
export type { BucketPermissionParameters } from './models/BucketPermissionParameters';
export { BucketType } from './models/BucketType';
export { Constraint } from './models/Constraint';
export type { ErrorDetail } from './models/ErrorDetail';
export type { HTTPValidationError } from './models/HTTPValidationError';
export { PermissionEnum } from './models/PermissionEnum';
export { Permission } from './models/Permission';
export { PermissionStatus } from './models/PermissionStatus';
export type { S3Key } from './models/S3Key';
export type { S3ObjectMetaInformation } from './models/S3ObjectMetaInformation';
export type { User } from './models/User';
export type { ValidationError } from './models/ValidationError';
export { AuthService } from './services/AuthService';
export { BucketService } from './services/BucketService';
export { BucketPermissionsService } from './services/BucketPermissionsService';
export { KeyService } from './services/KeyService';
export { MiscellaneousService } from './services/MiscellaneousService';
export { BucketPermissionService } from './services/BucketPermissionService';
export { ObjectService } from './services/ObjectService';
export { UserService } from './services/UserService';
export { S3KeyService } from './services/S3KeyService';
......@@ -2,6 +2,8 @@
/* tslint:disable */
/* eslint-disable */
import type { Constraint } from './Constraint';
/**
* Schema for answering a request with a bucket.
*/
......@@ -30,5 +32,9 @@ export type BucketOut = {
* Total size of objects in this bucket in bytes
*/
size: number;
/**
* Constraint for the owner of the bucket
*/
owner_constraint?: Constraint;
};
......@@ -2,7 +2,7 @@
/* tslint:disable */
/* eslint-disable */
import type { PermissionEnum } from './PermissionEnum';
import type { Permission } from './Permission';
/**
* Schema for the parameters of a bucket permission.
......@@ -23,7 +23,7 @@ export type BucketPermissionIn = {
/**
* Permission
*/
permission?: (PermissionEnum | string);
permission?: (Permission | string);
/**
* UID of the grantee
*/
......
......@@ -2,7 +2,7 @@
/* tslint:disable */
/* eslint-disable */
import type { PermissionEnum } from './PermissionEnum';
import type { Permission } from './Permission';
/**
* Schema for the bucket permissions.
......@@ -23,7 +23,7 @@ export type BucketPermissionOut = {
/**
* Permission
*/
permission?: (PermissionEnum | string);
permission?: (Permission | string);
/**
* UID of the grantee
*/
......
......@@ -2,7 +2,7 @@
/* tslint:disable */
/* eslint-disable */
import type { PermissionEnum } from './PermissionEnum';
import type { Permission } from './Permission';
/**
* Schema for the parameters of a bucket permission.
......@@ -23,6 +23,6 @@ export type BucketPermissionParameters = {
/**
* Permission
*/
permission?: (PermissionEnum | string);
permission?: (Permission | string);
};
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
/**
* Enumeration for the type of buckets to fetch from the DB
*
* OWN: Only fetch buckets that the user owns
* PERMISSION: Only fetch foreign buckets that the user has access to
* ALL: Fetch all buckets that the user has access to
*/
export enum BucketType {
OWN = 'OWN',
ALL = 'ALL',
PERMISSION = 'PERMISSION',
}
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
/**
* Enumeration for the possible permission on a bucket.
*/
export enum Constraint {
READ = 'READ',
WRITE = 'WRITE',
}
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
/**
* Schema for a error due to a rejected request.
*/
export type ErrorDetail = {
/**
* Detail about the occurred error
*/
detail: string;
};
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { ValidationError } from './ValidationError';
export type HTTPValidationError = {
detail?: Array<ValidationError>;
};
......@@ -5,7 +5,7 @@
/**
* Enumeration for the possible permission on a bucket.
*/
export enum PermissionEnum {
export enum Permission {
READ = 'READ',
WRITE = 'WRITE',
READWRITE = 'READWRITE',
......
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
/**
* Status of a bucket permission. Can be either `ACTIVE` or `INACTIVE`. A permission can only get `INACTIVE` if the
* permission itself has a time limit and the current time is not in the timespan.
*/
export enum PermissionStatus {
ACTIVE = 'ACTIVE',
INACTIVE = 'INACTIVE',
}
File moved
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment