From f9c5041af11e2359ce8609d3988fc93fe0897c98 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Mon, 13 May 2024 17:02:37 +0530 Subject: [PATCH] feat: add folder api --- .../cloud/customRoute/v1/apiV1.js | 15 ++++ .../customRoute/v1/routes/createFolder.js | 66 ++++++++++++++++ .../cloud/customRoute/v1/routes/getFolder.js | 65 ++++++++++++++++ .../customRoute/v1/routes/getFolderList.js | 76 +++++++++++++++++++ .../customRoute/v1/routes/updateFolder.js | 69 +++++++++++++++++ 5 files changed, 291 insertions(+) create mode 100644 apps/OpenSignServer/cloud/customRoute/v1/routes/createFolder.js create mode 100644 apps/OpenSignServer/cloud/customRoute/v1/routes/getFolder.js create mode 100644 apps/OpenSignServer/cloud/customRoute/v1/routes/getFolderList.js create mode 100644 apps/OpenSignServer/cloud/customRoute/v1/routes/updateFolder.js diff --git a/apps/OpenSignServer/cloud/customRoute/v1/apiV1.js b/apps/OpenSignServer/cloud/customRoute/v1/apiV1.js index e4f532853..867607f22 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/apiV1.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/apiV1.js @@ -26,6 +26,10 @@ import getWebhook from './routes/getWebhook.js'; import createDocumentwithCoordinate from './routes/createDocumentwithCoordinate.js'; import createTemplatewithCoordinate from './routes/createTemplatewithCoordinate.js'; import resendMail from './routes/resendMail.js'; +import getFolder from './routes/getFolder.js'; +import createFolder from './routes/createFolder.js'; +import updateFolder from './routes/updateFolder.js'; +import getFolderList from './routes/getFolderList.js'; dotenv.config(); const storage = multer.memoryStorage(); const upload = multer({ storage: storage }); @@ -106,3 +110,14 @@ app.delete('/webhook', deleteWebhook); // resend mail app.post('/resendmail', resendMail); +// create folder +app.post('/createfolder', createFolder); + +// update folder +app.put('/folder/:folder_id', updateFolder); + +// get folder +app.get('/folder/:folder_id', getFolder); + +// get folder list +app.get('/folderlist', getFolderList); diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/createFolder.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/createFolder.js new file mode 100644 index 000000000..b240b74f1 --- /dev/null +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/createFolder.js @@ -0,0 +1,66 @@ +export default async function createFolder(request, response) { + const apiToken = request.headers['x-api-token']; + const folderName = request.body.folderName; + const parentFolderId = request.body.parentFolderId; + if (!apiToken) { + return response.status(400).json({ error: 'Please Provide API Token' }); + } + try { + const tokenQuery = new Parse.Query('appToken'); + tokenQuery.equalTo('token', apiToken); + tokenQuery.include('userId'); + const token = await tokenQuery.first({ useMasterKey: true }); + if (token !== undefined) { + // Valid Token then proceed request + const parseUser = JSON.parse(JSON.stringify(token)); + const userPtr = { + __type: 'Pointer', + className: '_User', + objectId: parseUser.userId.objectId, + }; + const userQuery = new Parse.Query('contracts_Users'); + userQuery.equalTo('UserId', userPtr); + const extUser = await userQuery.first({ useMasterKey: true }); + + const folderCls = new Parse.Object('contracts_Document'); + folderCls.set('Name', folderName); + folderCls.set('CreatedBy', userPtr); + folderCls.set('Type', 'Folder'); + folderCls.set('ExtUserPtr', { + __type: 'Pointer', + className: 'contracts_Users', + objectId: extUser.id, + }); + if (parentFolderId) { + folderCls.set('Folder', { + __type: 'Pointer', + className: 'contracts_Document', + objectId: parentFolderId, + }); + } + const acl = new Parse.ACL(); + acl.setReadAccess(parseUser.userId.objectId, true); // Allow read access to the userPtr + acl.setWriteAccess(parseUser.userId.objectId, true); // Allow write access to the userPtr + + // Set the ACL to the document + folderCls.setACL(acl); + + const _resFolder = await folderCls.save(null, { useMasterKey: true }); + if (_resFolder) { + if (request.posthog) { + request.posthog?.capture({ + distinctId: parseUser.userId.email, + event: 'api_create_folder', + properties: { response_code: 200 }, + }); + } + return response.status(200).json({ status: 'folder created successfully.' }); + } + } else { + return response.status(405).json({ error: 'Invalid API Token!' }); + } + } catch (err) { + console.log('err ', err); + return response.status(400).json({ error: 'Something went wrong, please try again later!' }); + } +} diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/getFolder.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/getFolder.js new file mode 100644 index 000000000..d38c2253f --- /dev/null +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/getFolder.js @@ -0,0 +1,65 @@ +export default async function getFolder(request, response) { + const apiToken = request.headers['x-api-token']; + const folder_id = request.params.folder_id; + if (!apiToken) { + return response.status(400).json({ error: 'Please Provide API Token' }); + } + try { + const tokenQuery = new Parse.Query('appToken'); + tokenQuery.equalTo('token', apiToken); + tokenQuery.include('userId'); + const token = await tokenQuery.first({ useMasterKey: true }); + if (token !== undefined) { + // Valid Token then proceed request + const parseUser = JSON.parse(JSON.stringify(token)); + const userPtr = { + __type: 'Pointer', + className: '_User', + objectId: parseUser.userId.objectId, + }; + + const folderCls = new Parse.Query('contracts_Document'); + folderCls.equalTo('CreatedBy', userPtr); + folderCls.equalTo('objectId', folder_id); + folderCls.equalTo('Type', 'Folder'); + folderCls.notEqualTo('IsArchive', true); + folderCls.descending('createdAt'); + folderCls.include('Folder'); + + const res = await folderCls.first({ useMasterKey: true }); + if (res) { + const parseRes = JSON.parse(JSON.stringify(res)); + const folder = { + objectId: parseRes.objectId, + folderName: parseRes.Name, + parentFolderId: parseRes?.Folder?.objectId || '', + parentFolderName: parseRes?.Folder?.Name || '', + createdAt: parseRes.createdAt, + updatedAt: parseRes.updatedAt, + }; + if (request.posthog) { + request.posthog?.capture({ + distinctId: parseUser.userId.email, + event: 'api_get_folder', + properties: { response_code: 200 }, + }); + } + return response.json({ result: folder }); + } else { + if (request.posthog) { + request.posthog?.capture({ + distinctId: parseUser.userId.email, + event: 'api_get_folder', + properties: { response_code: 404 }, + }); + } + return response.status(404).json({ error: 'folder not found.' }); + } + } else { + return response.status(405).json({ error: 'Invalid API Token!' }); + } + } catch (err) { + console.log('err ', err); + return response.status(400).json({ error: 'Something went wrong, please try again later!' }); + } +} diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/getFolderList.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/getFolderList.js new file mode 100644 index 000000000..e3a73d862 --- /dev/null +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/getFolderList.js @@ -0,0 +1,76 @@ +export default async function getFolderList(request, response) { + const apiToken = request.headers['x-api-token']; + const parentFolderId = request.body.parentFolderId; + if (!apiToken) { + return response.status(400).json({ error: 'Please Provide API Token' }); + } + try { + const tokenQuery = new Parse.Query('appToken'); + tokenQuery.equalTo('token', apiToken); + tokenQuery.include('userId'); + const token = await tokenQuery.first({ useMasterKey: true }); + if (token !== undefined) { + // Valid Token then proceed request + const parseUser = JSON.parse(JSON.stringify(token)); + const userPtr = { + __type: 'Pointer', + className: '_User', + objectId: parseUser.userId.objectId, + }; + const limit = request?.query?.limit ? parseInt(request.query.limit) : 100; + const skip = request?.query?.skip ? parseInt(request.query.skip) : 0; + const folderCls = new Parse.Query('contracts_Document'); + folderCls.equalTo('CreatedBy', userPtr); + folderCls.equalTo('Type', 'Folder'); + folderCls.notEqualTo('IsArchive', true); + folderCls.descending('createdAt'); + folderCls.include('Folder'); + if (parentFolderId) { + folderCls.equalTo('Folder', { + __type: 'Pointer', + className: 'contracts_Document', + objectId: parentFolderId, + }); + } else { + folderCls.doesNotExist('Folder'); + } + folderCls.descending('createdAt'); + folderCls.limit(limit); + folderCls.skip(skip); + const res = await folderCls.find({ useMasterKey: true }); + if (res && res.length > 0) { + const parseRes = JSON.parse(JSON.stringify(res)); + const folderlist = parseRes.map(x => ({ + objectId: x.objectId, + folderName: x.Name, + parentFolderId: x?.Folder?.objectId || '', + parentFolderName: x?.Folder?.Name || '', + createdAt: x.createdAt, + updatedAt: x.updatedAt, + })); + if (request.posthog) { + request.posthog?.capture({ + distinctId: parseUser.userId.email, + event: 'api_get_Folder_list', + properties: { response_code: 200 }, + }); + } + return response.json({ result: folderlist }); + } else { + if (request.posthog) { + request.posthog?.capture({ + distinctId: parseUser.userId.email, + event: 'api_get_Folder_list', + properties: { response_code: 200 }, + }); + } + return response.json({ result: [] }); + } + } else { + return response.status(405).json({ error: 'Invalid API Token!' }); + } + } catch (err) { + console.log('err ', err); + return response.status(400).json({ error: 'Something went wrong, please try again later!' }); + } +} diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/updateFolder.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/updateFolder.js new file mode 100644 index 000000000..4be05139d --- /dev/null +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/updateFolder.js @@ -0,0 +1,69 @@ +export default async function updateFolder(request, response) { + const apiToken = request.headers['x-api-token']; + const folderId = request.params.folder_id; + const name = request.body.foldername; + const parentFolderId = request.body.parentFolderId; + if (!apiToken) { + return response.status(400).json({ error: 'Please Provide API Token' }); + } + try { + const tokenQuery = new Parse.Query('appToken'); + tokenQuery.equalTo('token', apiToken); + tokenQuery.include('userId'); + const token = await tokenQuery.first({ useMasterKey: true }); + if (token !== undefined) { + // Valid Token then proceed request + const parseUser = JSON.parse(JSON.stringify(token)); + const userPtr = { + __type: 'Pointer', + className: '_User', + objectId: parseUser.userId.objectId, + }; + + const folderCls = new Parse.Query('contracts_Document'); + folderCls.equalTo('CreatedBy', userPtr); + folderCls.equalTo('objectId', folderId); + folderCls.equalTo('Type', 'Folder'); + folderCls.notEqualTo('IsArchive', true); + + const res = await folderCls.first({ useMasterKey: true }); + if (res) { + const updateFolder = new Parse.Object('contracts_Document'); + updateFolder.id = res.id; + updateFolder.set('Name', name); + if (parentFolderId) { + updateFolder.set('Folder', { + __type: 'Pointer', + className: 'contracts_Document', + objectId: parentFolderId, + }); + } + const updateRes = await updateFolder.save(null, { useMasterKey: true }); + if (request.posthog) { + request.posthog?.capture({ + distinctId: parseUser.userId.email, + event: 'api_update_folder', + properties: { response_code: 200 }, + }); + } + return response.json({ + result: { objectId: updateRes.id, updatedAt: updateRes.updatedAt }, + }); + } else { + if (request.posthog) { + request.posthog?.capture({ + distinctId: parseUser.userId.email, + event: 'api_update_folder', + properties: { response_code: 404 }, + }); + } + return response.status(404).json({ error: 'folder not found.' }); + } + } else { + return response.status(405).json({ error: 'Invalid API Token!' }); + } + } catch (err) { + console.log('err ', err); + return response.status(400).json({ error: 'Something went wrong, please try again later!' }); + } +}