import * as protoModule from './proto-generated'; import {wix} from './proto-generated'; import {ClientOptions, convertObjectToFieldMask} from '@wix/catalyst-platformized-http-client'; import {CurrentUserRole, FileSharingClientOptions} from './models'; import {AppSettingsServiceClient, FileSharingServiceClient, PermissionsServiceClient} from './service-clients'; import Bottleneck from 'bottleneck'; const Long = require('long'); const CompleteUploadLimiter = new Bottleneck({ maxConcurrent: 2, }); function withDefaultOptions(opts: FileSharingClientOptions): FileSharingClientOptions { return { authorization: '', fileSharingServerUrl: 'https://filesharing.wix.com', fetch: undefined, makeAuthorizationHeaders: instance => { return { Authorization: instance }; }, ...opts }; } function mapFileSharingOptionsToClientOptions(options: FileSharingClientOptions): ClientOptions { return { authorization: options.authorization, protoModule, serverUrl: options.fileSharingServerUrl, fetch: options.fetch, makeAuthorizationHeaders: options.makeAuthorizationHeaders, }; } export class FileSharingClient { static create(options: FileSharingClientOptions): FileSharingClient { const clientOptions: ClientOptions = mapFileSharingOptionsToClientOptions(withDefaultOptions(options)); return new FileSharingClient( new AppSettingsServiceClient(clientOptions), new FileSharingServiceClient(clientOptions), new PermissionsServiceClient(clientOptions) ); } private constructor( readonly appSettingsServiceClient: AppSettingsServiceClient, readonly fileSharingServiceClient: FileSharingServiceClient, readonly permissionsServiceClient: PermissionsServiceClient ) {} async updateAppSettings(update: wix.filesharing.api.v1.settings.AppSettings): Promise { const request: wix.filesharing.api.v1.settings.UpdateAppSettingsRequest = { settings: update, fieldMask: convertObjectToFieldMask(update) }; return this.appSettingsServiceClient.updateAppSettings(request); } async getAppSettings(request: wix.filesharing.api.v1.settings.GetAppSettingsRequest = {}): Promise { return this.appSettingsServiceClient.getAppSettings(request); } async queryLibraryItems(request: wix.filesharing.api.v1.libraryitems.QueryLibraryItemsRequest): Promise { return this.fileSharingServiceClient.queryLibraryItems(request); } async queryLibraryFolderItems(request: wix.filesharing.api.v1.libraryitems.QueryLibraryFolderItemsRequest): Promise { return this.fileSharingServiceClient.queryLibraryFolderItems(request); } async getLibraryItemsById(request: wix.filesharing.api.v1.libraryitems.GetLibraryItemsByIdRequest): Promise { return this.fileSharingServiceClient.getLibraryItemsById(request); } async listAllowedActions(request: wix.filesharing.api.v1.libraryitems.ListAllowedActionsRequest): Promise { return this.fileSharingServiceClient.listAllowedActions(request); } async getFolderTree(request: wix.filesharing.api.v1.libraryitems.GetFolderTreeRequest): Promise { return this.fileSharingServiceClient.getFolderTree(request); } async createFolder(request: wix.filesharing.api.v1.libraryitems.CreateFolderRequest): Promise { return this.fileSharingServiceClient.createFolder(request); } async removePermissions(request: wix.filesharing.api.v1.permissions.RemoveRequest): Promise { return this.permissionsServiceClient.remove(request); } async assignPermissions(request: wix.filesharing.api.v1.permissions.AssignRequest): Promise { return this.permissionsServiceClient.assign(request); } async listRoles(request: wix.filesharing.api.v1.permissions.ListRolesRequest): Promise { return this.permissionsServiceClient.listRoles(request); } async listCurrentUserRoles(): Promise { const response = await this.listRoles({ofCurrentUser: true}); return response.roles.map(role => ({ id: role.id, name: role.name, roleType: role.roleType })); } async startFileUpload(request: wix.filesharing.api.v1.libraryitems.StartFileUploadRequest): Promise { // TODO can be removed when size is removed const r: wix.filesharing.api.v1.libraryitems.StartFileUploadRequest = { actions: request.actions.map(action => { if (action.size > 0) { return { ...action, size: 0, sizeInBytes: Long.fromInt(action.size) }; } return action; }) }; return this.fileSharingServiceClient.startFileUpload(request); } async completeFileUpload(request: wix.filesharing.api.v1.libraryitems.CompleteFileUploadRequest): Promise { return await CompleteUploadLimiter.schedule(() => this.fileSharingServiceClient.completeFileUpload(request) ); } async download(request: wix.filesharing.api.v1.libraryitems.DownloadRequest): Promise { return this.fileSharingServiceClient.download(request); } async move(request: wix.filesharing.api.v1.libraryitems.MoveRequest): Promise { return this.fileSharingServiceClient.move(request); } async rename(request: wix.filesharing.api.v1.libraryitems.RenameRequest): Promise { return this.fileSharingServiceClient.rename(request); } async delete(request: wix.filesharing.api.v1.libraryitems.DeleteRequest): Promise { return this.fileSharingServiceClient.delete(request); } async viewFile(request: wix.filesharing.api.v1.libraryitems.ViewFileRequest): Promise { return this.fileSharingServiceClient.viewFile(request); } async viewFolder(request: wix.filesharing.api.v1.libraryitems.ViewFolderRequest): Promise { return this.fileSharingServiceClient.viewFolder(request); } async favorite(request: wix.filesharing.api.v1.libraryitems.FavoriteRequest): Promise { return this.fileSharingServiceClient.favorite(request); } async share(request: wix.filesharing.api.v1.libraryitems.ShareRequest): Promise { return this.fileSharingServiceClient.share(request); } }