From deea056a1b359b45b7a216ed0b9e82b80d33841e Mon Sep 17 00:00:00 2001 From: Bhanu P Chaudhary Date: Mon, 7 Jun 2021 15:38:40 +0530 Subject: [PATCH] added scaleway plugin Signed-off-by: Bhanu P Chaudhary --- packages/nc-gui/static/plugins/scaleway.png | Bin 0 -> 2969 bytes .../src/lib/noco/plugins/NcPluginMgr.ts | 27 +++- .../plugins/scaleway/ScalewayObjectStorage.ts | 118 ++++++++++++++++++ .../scaleway/ScalewayObjectStoragePlugin.ts | 43 +++++++ packages/nocodb/src/plugins/scaleway/index.ts | 80 ++++++++++++ 5 files changed, 267 insertions(+), 1 deletion(-) create mode 100644 packages/nc-gui/static/plugins/scaleway.png create mode 100644 packages/nocodb/src/plugins/scaleway/ScalewayObjectStorage.ts create mode 100644 packages/nocodb/src/plugins/scaleway/ScalewayObjectStoragePlugin.ts create mode 100644 packages/nocodb/src/plugins/scaleway/index.ts diff --git a/packages/nc-gui/static/plugins/scaleway.png b/packages/nc-gui/static/plugins/scaleway.png new file mode 100644 index 0000000000000000000000000000000000000000..342a50f6867f28325e7d4a19ae60af232566130e GIT binary patch literal 2969 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 P00000NkvXXu0mjfTnC!@ literal 0 HcmV?d00001 diff --git a/packages/nocodb/src/lib/noco/plugins/NcPluginMgr.ts b/packages/nocodb/src/lib/noco/plugins/NcPluginMgr.ts index 84b6e122e9..54c2ee9eef 100644 --- a/packages/nocodb/src/lib/noco/plugins/NcPluginMgr.ts +++ b/packages/nocodb/src/lib/noco/plugins/NcPluginMgr.ts @@ -24,6 +24,7 @@ import MattermostPluginConfig from "../../../plugins/mattermost"; import DiscordPluginConfig from "../../../plugins/discord"; import TwilioWhatsappPluginConfig from "../../../plugins/twilioWhatsapp"; import TwilioPluginConfig from "../../../plugins/twilio"; +import ScalewayPluginConfig from "../../../plugins/scaleway"; import Noco from "../Noco"; import Local from "./adapters/storage/Local"; @@ -45,6 +46,7 @@ const defaultPlugins = [ LinodePluginConfig, UpcloudPluginConfig, SMTPPluginConfig, + ScalewayPluginConfig, ] class NcPluginMgr { @@ -129,4 +131,27 @@ class NcPluginMgr { } -export default NcPluginMgr; \ No newline at end of file +export default NcPluginMgr; + +/** + * @copyright Copyright (c) 2021, Xgene Cloud Ltd + * + * @author Pranav C Balan + * @author Bhanu P Chaudhary + * + * @license GNU AGPL version 3 or any later version + * + * 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 . + * + */ \ No newline at end of file diff --git a/packages/nocodb/src/plugins/scaleway/ScalewayObjectStorage.ts b/packages/nocodb/src/plugins/scaleway/ScalewayObjectStorage.ts new file mode 100644 index 0000000000..99b1dca9e0 --- /dev/null +++ b/packages/nocodb/src/plugins/scaleway/ScalewayObjectStorage.ts @@ -0,0 +1,118 @@ +import AWS from "aws-sdk"; +import fs from "fs"; +import path from "path"; +import {IStorageAdapter, XcFile} from "nc-plugin"; + +export default class ScalewayObjectStorage implements IStorageAdapter { + + private s3Client: AWS.S3; + private input: any; + + constructor(input: any) { + this.input = input; + } + + + async fileCreate(key: string, file: XcFile): Promise { + + const uploadParams: any = { + ACL: 'public-read' + }; + return new Promise((resolve, reject) => { + // Configure the file stream and obtain the upload parameters + const fileStream = fs.createReadStream(file.path); + fileStream.on('error', (err) => { + console.log('File Error', err); + reject(err); + }); + + uploadParams.Body = fileStream; + uploadParams.Key = key; + + // call S3 to retrieve upload file to specified bucket + this.s3Client.upload(uploadParams, (err, data) => { + if (err) { + console.log("Error", err); + reject(err); + } + if (data) { + resolve(data.Location); + } + }); + }); + } + + public async fileDelete(_path: string): Promise { + return Promise.resolve(undefined); + } + + public async fileRead(key: string): Promise { + return new Promise((resolve, reject) => { + this.s3Client.getObject({Key: key} as any, (err, data) => { + if (err) { + return reject(err); + } + if (!data?.Body) { + return reject(data); + } + return resolve(data.Body); + }); + }); + } + + public async init(): Promise { + const s3Options: any = { + params: {Bucket: this.input.bucket}, + region: this.input.region + }; + + s3Options.accessKeyId = this.input.access_key + s3Options.secretAccessKey = this.input.access_secret; + + s3Options.endpoint = new AWS.Endpoint(`s3.${this.input.region}.scw.cloud`); + + this.s3Client = new AWS.S3(s3Options); + } + + public async test(): Promise { + try { + const tempFile = path.join(process.cwd(), 'temp.txt'); + const createStream = fs.createWriteStream(tempFile); + createStream.end(); + await this.fileCreate('/test.txt', { + path: tempFile, + mimetype: '', + originalname: 'temp.txt', + size: '' + }); + fs.unlinkSync(tempFile); + return true; + } catch (e) { + throw e; + } + } + +} + + +/** + * @copyright Copyright (c) 2021, Bhanu P Chaudhary + * + * @author Bhanu P Chaudhary + * + * @license GNU AGPL version 3 or any later version + * + * 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 . + * + */ \ No newline at end of file diff --git a/packages/nocodb/src/plugins/scaleway/ScalewayObjectStoragePlugin.ts b/packages/nocodb/src/plugins/scaleway/ScalewayObjectStoragePlugin.ts new file mode 100644 index 0000000000..446f63a58d --- /dev/null +++ b/packages/nocodb/src/plugins/scaleway/ScalewayObjectStoragePlugin.ts @@ -0,0 +1,43 @@ +import {IStorageAdapter, XcStoragePlugin} from "nc-plugin"; +import ScalewayObjectStorage from "./ScalewayObjectStorage"; + + +class ScalewayObjectStoragePlugin extends XcStoragePlugin { + + private static storageAdapter: ScalewayObjectStorage; + + public getAdapter(): IStorageAdapter { + return ScalewayObjectStoragePlugin.storageAdapter; + } + + public async init(config: any): Promise { + ScalewayObjectStoragePlugin.storageAdapter = new ScalewayObjectStorage(config); + await ScalewayObjectStoragePlugin.storageAdapter.init(); + } + +} + +export default ScalewayObjectStoragePlugin; + + +/** + * @copyright Copyright (c) 2021, Bhanu P Chaudhary + * + * @author Bhanu P Chaudhary + * + * @license GNU AGPL version 3 or any later version + * + * 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 . + * + */ \ No newline at end of file diff --git a/packages/nocodb/src/plugins/scaleway/index.ts b/packages/nocodb/src/plugins/scaleway/index.ts new file mode 100644 index 0000000000..f99689e9b8 --- /dev/null +++ b/packages/nocodb/src/plugins/scaleway/index.ts @@ -0,0 +1,80 @@ +import {XcPluginConfig} from "nc-plugin"; +import ScalewayObjectStoragePlugin from "./ScalewayObjectStoragePlugin"; +import {XcActionType, XcType} from "nc-common"; + +const config: XcPluginConfig = { + builder: ScalewayObjectStoragePlugin, + title: 'Scaleway Object Storage', + version: '0.0.1', + logo: 'plugins/scaleway.png', + tags: 'Storage', + description: 'S3-compatible Scaleway Object Storage makes it easy and more affordable to store and access data on Scaleway Cloud Platform infrastructure. The service also gives a 75GB free storage and external outgoing transfer on Object Storage every month', + inputs: { + title: 'Configure Scaleway Object Storage', + items: [{ + key: 'bucket', + label: 'Bucket Name', + placeholder: 'Bucket Name', + type: XcType.SingleLineText, + required: true + }, { + key: 'region', + label: 'Region', + placeholder: 'Region', + type: XcType.SingleLineText, + required: true + }, { + key: 'access_key', + label: 'Access Key', + placeholder: 'Access Key', + type: XcType.SingleLineText, + required: true + }, { + key: 'access_secret', + label: 'Access Secret', + placeholder: 'Access Secret', + type: XcType.Password, + required: true + },], + actions: [{ + label: 'Test', + placeholder: 'Test', + key: 'test', + actionType: XcActionType.TEST, + type: XcType.Button + }, { + label: 'Save', + placeholder: 'Save', + key: 'save', + actionType: XcActionType.SUBMIT, + type: XcType.Button + },], + msgOnInstall: 'Successfully installed and attachment will be stored in Scaleway Object Storage', + msgOnUninstall: '', + }, + category: 'Storage', +} + +export default config; + +/** + * @copyright Copyright (c) 2021, Bhanu P Chaudhary + * + * @author Bhanu P Chaudhary + * + * @license GNU AGPL version 3 or any later version + * + * 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 . + * + */ \ No newline at end of file