change userId type from string to pointer in appToken class and handle stringify array

This commit is contained in:
prafull-opensignlabs
2024-01-19 00:33:08 +05:30
parent 39f3f73896
commit 2a8cedca58
21 changed files with 94 additions and 92 deletions
+1 -1
View File
@@ -33,7 +33,7 @@
"target": "_self",
"benefits": [
"Sign Unlimited Documents",
"Unlimited Secure Doc Storage with OpenSignDrive",
"Unlimited Secure Doc Storage with OpenSignDrive",
"Unlimited Guest Signers",
"Unlimited completion certificates",
"Unique Code(OTP) verification for guest signers",
@@ -371,7 +371,7 @@ const ReportTable = ({
)}
{heading.includes("Folder") && (
<td className="px-4 py-2">
{item?.Folder?.Name || "OpenSignDrive"}
{item?.Folder?.Name || "OpenSignDrive"}
</td>
)}
<td className="px-4 py-2">
@@ -17,9 +17,10 @@ import getTemplatetList from './routes/getTemplateList.js';
import updateTemplate from './routes/updateTemplate.js';
import createContact from './routes/createContact.js';
import multer from 'multer';
import fs from 'node:fs';
// import fs from 'node:fs';
import updateDocument from './routes/updateDocument.js';
import deleteDocument from './routes/deleteDocument.js';
// import createDocumentWithTemplate from './routes/CreateDocumentWithTemplate.js';
dotenv.config();
const storage = multer.memoryStorage();
@@ -47,6 +48,8 @@ app.get('/contactlist', getContactList);
// create Document
app.post('/createdocument', upload.array('file', 1), createDocument);
// create Document with templateId
// app.post('/createdocument/:template_id', createDocumentWithTemplate);
// get Document on the basis of id
app.get('/document/:document_id', getDocument);
@@ -60,7 +63,7 @@ app.delete('/document/:document_id', deleteDocument);
app.get('/documentlist/:doctype', getDocumentList);
// create Template
app.post('/createtemplate',upload.array('file', 1), createTemplate);
app.post('/createtemplate', upload.array('file', 1), createTemplate);
// get template on the basis of id
app.get('/template/:template_id', getTemplate);
@@ -73,4 +76,3 @@ app.delete('/template/:template_id', deletedTemplate);
// get all types of documents on the basis of doctype
app.get('/templatelist', getTemplatetList);
@@ -14,11 +14,10 @@ export default async function createContact(request, response) {
const token = await tokenQuery.first({ useMasterKey: true });
if (token !== undefined) {
// Valid Token then proceed request
const id = token.get('Id');
const userId = { __type: 'Pointer', className: '_User', objectId: id };
const userPtr = token.get('userId');
try {
const Tenant = new Parse.Query('partners_Tenant');
Tenant.equalTo('UserId', userId);
Tenant.equalTo('UserId', userPtr);
const tenantRes = await Tenant.first({ useMasterKey: true });
const contactQuery = new Parse.Object('contracts_Contactbook');
@@ -56,13 +55,13 @@ export default async function createContact(request, response) {
userId: user.id,
};
await axios.post(roleurl, body, { headers: headers });
const currentUser = userId;
const currentUser = userPtr;
contactQuery.set('CreatedBy', currentUser);
contactQuery.set('UserId', user);
const acl = new Parse.ACL();
acl.setReadAccess(id, true);
acl.setWriteAccess(id, true);
acl.setReadAccess(userPtr.id, true);
acl.setWriteAccess(userPtr.id, true);
acl.setReadAccess(user.id, true);
acl.setWriteAccess(user.id, true);
contactQuery.setACL(acl);
@@ -79,7 +78,7 @@ export default async function createContact(request, response) {
});
}
} catch (err) {
console.log('err ', err);
console.log('err in', err);
if (err.code === 202) {
const params = { email: email };
const userRes = await Parse.Cloud.run('getUserId', params);
@@ -95,15 +94,15 @@ export default async function createContact(request, response) {
userId: userRes.id,
};
await axios.post(roleurl, body, { headers: headers });
contactQuery.set('CreatedBy', userId);
contactQuery.set('CreatedBy', userPtr);
contactQuery.set('UserId', {
__type: 'Pointer',
className: '_User',
objectId: userRes.id,
});
const acl = new Parse.ACL();
acl.setReadAccess(id, true);
acl.setWriteAccess(id, true);
acl.setReadAccess(userPtr.id, true);
acl.setWriteAccess(userPtr.id, true);
acl.setReadAccess(userRes.id, true);
acl.setWriteAccess(userRes.id, true);
@@ -121,6 +120,9 @@ export default async function createContact(request, response) {
});
}
} else {
if (err.code === 137) {
return response.status(401).json({ error: 'Contact already exists!' });
}
return response
.status(400)
.json({ error: 'Something went wrong, please try again later!' });
@@ -128,7 +130,13 @@ export default async function createContact(request, response) {
}
} catch (err) {
console.log('err ', err);
return response.status(400).json({ error: 'Something went wrong, please try again later!' });
if (err.code === 137) {
return response.status(137).json({ error: 'Contact already exists!' });
} else {
return response
.status(400)
.json({ error: 'Something went wrong, please try again later!' });
}
}
} else {
return response.status(405).json({ error: 'Invalid API Token!' });
@@ -9,12 +9,6 @@ export default async function createDocument(request, response) {
const url = process.env.SERVER_URL;
const fileData = request.files[0] ? request.files[0].buffer : null;
try {
const file = new Parse.File(request.files[0].originalname, {
base64: fileData.toString('base64'),
});
await file.save({ useMasterKey: true });
const fileUrl = file.url();
const reqToken = request.headers['x-api-token'];
if (!reqToken) {
return response.status(400).json({ error: 'Please Provide API Token' });
@@ -24,11 +18,15 @@ export default async function createDocument(request, response) {
const token = await tokenQuery.first({ useMasterKey: true });
if (token !== undefined) {
// Valid Token then proceed request
const id = token.get('Id');
const userId = { __type: 'Pointer', className: '_User', objectId: id };
const userPtr = token.get('userId');
const file = new Parse.File(request.files?.[0]?.originalname, {
base64: fileData.toString('base64'),
});
await file.save({ useMasterKey: true });
const fileUrl = file.url();
const contractsUser = new Parse.Query('contracts_Users');
contractsUser.equalTo('UserId', userId);
contractsUser.equalTo('UserId', userPtr);
const extUser = await contractsUser.first({ useMasterKey: true });
const extUserPtr = { __type: 'Pointer', className: 'contracts_Users', objectId: extUser.id };
@@ -43,10 +41,11 @@ export default async function createDocument(request, response) {
object.set('Description', description);
}
object.set('URL', fileUrl);
object.set('CreatedBy', userId);
object.set('CreatedBy', userPtr);
object.set('ExtUserPtr', extUserPtr);
if (signers) {
const placeholders = signers.map(x => ({
const parseSigners = JSON.parse(signers);
const placeholders = parseSigners.map(x => ({
email: x,
Id: randomId(),
Role: '',
@@ -63,8 +62,8 @@ export default async function createDocument(request, response) {
const newACL = new Parse.ACL();
newACL.setPublicReadAccess(false);
newACL.setPublicWriteAccess(false);
newACL.setReadAccess(id, true);
newACL.setWriteAccess(id, true);
newACL.setReadAccess(userPtr.id, true);
newACL.setWriteAccess(userPtr.id, true);
object.setACL(newACL);
const res = await object.save(null, { useMasterKey: true });
return response.json({ objectId: res.id, url: url });
@@ -9,11 +9,6 @@ export default async function createTemplate(request, response) {
const url = process.env.SERVER_URL;
const fileData = request.files[0] ? request.files[0].buffer : null;
try {
const file = new Parse.File(request.files[0].originalname, {
base64: fileData.toString('base64'),
});
await file.save({ useMasterKey: true });
const fileUrl = file.url();
const reqToken = request.headers['x-api-token'];
if (!reqToken) {
return response.status(400).json({ error: 'Please Provide API Token' });
@@ -23,9 +18,12 @@ export default async function createTemplate(request, response) {
const token = await tokenQuery.first({ useMasterKey: true });
if (token !== undefined) {
// Valid Token then proceed request
const id = token.get('Id');
const userId = { __type: 'Pointer', className: '_User', objectId: id };
const userPtr = token.get('userId');
const file = new Parse.File(request.files?.[0]?.originalname, {
base64: fileData.toString('base64'),
});
await file.save({ useMasterKey: true });
const fileUrl = file.url();
const contractsUser = new Parse.Query('contracts_Users');
contractsUser.equalTo('UserId', userId);
const extUser = await contractsUser.first({ useMasterKey: true });
@@ -42,10 +40,11 @@ export default async function createTemplate(request, response) {
object.set('Description', description);
}
object.set('URL', fileUrl);
object.set('CreatedBy', userId);
object.set('CreatedBy', userPtr);
object.set('ExtUserPtr', extUserPtr);
if (signers) {
const placeholders = signers.map((x, i) => ({
const parseSigners = JSON.parse(signers);
const placeholders = parseSigners.map((x, i) => ({
email: x,
Id: randomId(),
Role: 'User ' + (i + 1),
@@ -62,8 +61,8 @@ export default async function createTemplate(request, response) {
const newACL = new Parse.ACL();
newACL.setPublicReadAccess(false);
newACL.setPublicWriteAccess(false);
newACL.setReadAccess(id, true);
newACL.setWriteAccess(id, true);
newACL.setReadAccess(userPtr.id, true);
newACL.setWriteAccess(userPtr.id, true);
object.setACL(newACL);
const res = await object.save(null, { useMasterKey: true });
return response.json({ objectId: res.id, url: url });
@@ -9,11 +9,10 @@ export default async function deleteContact(request, response) {
const token = await tokenQuery.first({ useMasterKey: true });
if (token !== undefined) {
// Valid Token then proceed request
const id = token.get('Id');
const userId = { __type: 'Pointer', className: '_User', objectId: id };
const userPtr = token.get('userId');
const Contactbook = new Parse.Query('contracts_Contactbook');
Contactbook.equalTo('objectId', request.params.contact_id);
Contactbook.equalTo('CreatedBy', userId);
Contactbook.equalTo('CreatedBy', userPtr);
const res = await Contactbook.first({ useMasterKey: true });
if (res) {
const isDeleted = res.get('IsDeleted');
@@ -9,11 +9,10 @@ export default async function deleteDocument(request, response) {
const token = await tokenQuery.first({ useMasterKey: true });
if (token !== undefined) {
// Valid Token then proceed request
const id = token.get('Id');
const userId = { __type: 'Pointer', className: '_User', objectId: id };
const userPtr = token.get('userId');
const Document = new Parse.Query('contracts_Document');
Document.equalTo('objectId', request.params.document_id);
Document.equalTo('CreatedBy', userId);
Document.equalTo('CreatedBy', userPtr);
const res = await Document.first({ useMasterKey: true });
if (res) {
const isArchive = res.get('IsArchive');
@@ -9,11 +9,10 @@ export default async function deletedTemplate(request, response) {
const token = await tokenQuery.first({ useMasterKey: true });
if (token !== undefined) {
// Valid Token then proceed request
const id = token.get('Id');
const userId = { __type: 'Pointer', className: '_User', objectId: id };
const userPtr = token.get('userId');
const template = new Parse.Query('contracts_Template');
template.equalTo('objectId', request.params.template_id);
template.equalTo('CreatedBy', userId);
template.equalTo('CreatedBy', userPtr);
const res = await template.first({ useMasterKey: true });
if (res) {
const isArchive = res.get('IsArchive');
@@ -9,11 +9,10 @@ export default async function getContact(request, response) {
const token = await tokenQuery.first({ useMasterKey: true });
if (token !== undefined) {
// Valid Token then proceed request
const id = token.get('Id');
const userId = { __type: 'Pointer', className: '_User', objectId: id };
const userPtr = token.get('userId');
const Contactbook = new Parse.Query('contracts_Contactbook');
Contactbook.equalTo('objectId', request.params.contact_id);
Contactbook.equalTo('CreatedBy', userId);
Contactbook.equalTo('CreatedBy', userPtr);
Contactbook.notEqualTo('IsDeleted', true);
Contactbook.select('Name,Email,Phone');
@@ -9,12 +9,12 @@ export default async function getContactList(request, response) {
const token = await tokenQuery.first({ useMasterKey: true });
if (token !== undefined) {
// Valid Token then proceed request
const id = token.get('Id');
const userId = { __type: 'Pointer', className: '_User', objectId: id };
const userPtr = token.get('userId');
const limit = request?.query?.limit ? request.query.limit : 100;
const skip = request?.query?.skip ? request.query.skip : 0;
const Contactbook = new Parse.Query('contracts_Contactbook');
Contactbook.equalTo('CreatedBy', userId);
Contactbook.equalTo('CreatedBy', userPtr);
Contactbook.notEqualTo('IsDeleted', true);
Contactbook.limit(limit);
Contactbook.skip(skip);
@@ -9,11 +9,10 @@ export default async function getDocument(request, response) {
const token = await tokenQuery.first({ useMasterKey: true });
if (token !== undefined) {
// Valid Token then proceed request
const id = token.get('Id');
const userId = { __type: 'Pointer', className: '_User', objectId: id };
const userPtr = token.get('userId');
const Document = new Parse.Query('contracts_Document');
Document.equalTo('objectId', request.params.document_id);
Document.equalTo('CreatedBy', userId);
Document.equalTo('CreatedBy', userPtr);
Document.notEqualTo('IsArchive', true);
Document.include('Signers');
Document.include('Folder');
@@ -15,7 +15,7 @@ export default async function getDocumentList(request, response) {
const token = await tokenQuery.first({ useMasterKey: true });
if (token !== undefined) {
// Valid Token then proceed request
const userId = token.get('Id');
const userPtr = token.get('userId');
const docType = request.params.doctype;
const limit = request?.query?.limit ? request.query.limit : 100;
const skip = request?.query?.skip ? request.query.skip : 0;
@@ -42,7 +42,7 @@ export default async function getDocumentList(request, response) {
default:
reportId = '';
}
const json = reportId && reportJson(reportId, userId);
const json = reportId && reportJson(reportId, userPtr.id);
const clsName = 'contracts_Document';
if (reportId && json) {
const { params, keys } = json;
@@ -59,14 +59,14 @@ export default async function getDocumentList(request, response) {
if (res.data && res.data.results.length > 0) {
const updateRes = res.data.results.map(x => ({
objectId: x.objectId,
title: x.Name,
note: x.Note || '',
folder: x?.Folder?.Name || 'OpenSign™ Drive',
file: x?.SignedUrl || x.URL,
owner: x?.ExtUserPtr?.Name,
signers: x?.Signers?.map(y => y?.Name) || '',
created_at: x.createdAt,
updated_at: x.updatedAt,
Title: x.Name,
Note: x.Note || '',
Folder: x?.Folder?.Name || 'OpenSign™ Drive',
File: x?.SignedUrl || x.URL,
Owner: x?.ExtUserPtr?.Name,
Signers: x?.Signers?.map(y => y?.Name) || '',
createdAt: x.createdAt,
updatedAt: x.updatedAt,
}));
return response.json({ result: updateRes });
} else {
@@ -9,11 +9,10 @@ export default async function getTemplate(request, response) {
const token = await tokenQuery.first({ useMasterKey: true });
if (token !== undefined) {
// Valid Token then proceed request
const id = token.get('Id');
const userId = { __type: 'Pointer', className: '_User', objectId: id };
const userPtr = token.get('userId');
const Template = new Parse.Query('contracts_Template');
Template.equalTo('objectId', request.params.template_id);
Template.equalTo('CreatedBy', userId);
Template.equalTo('CreatedBy', userPtr);
Template.notEqualTo('IsArchive', true);
Template.include('Signers');
Template.include('Folder');
@@ -14,18 +14,14 @@ export default async function getTemplatetList(request, response) {
const token = await tokenQuery.first({ useMasterKey: true });
if (token !== undefined) {
// Valid Token then proceed request
const userId = token.get('Id');
const userPtr = token.get('userId');
const limit = request?.query?.limit ? request.query.limit : 100;
const skip = request?.query?.skip ? request.query.skip : 0;
const clsName = 'contracts_Template';
const params = {
Type: { $ne: 'Folder' },
CreatedBy: {
__type: 'Pointer',
className: '_User',
objectId: userId,
},
CreatedBy: userPtr,
IsArchive: { $ne: true },
};
const keys = [
@@ -11,9 +11,9 @@ export default async function getUser(request, response) {
const token = await tokenQuery.first({ useMasterKey: true });
if (token !== undefined) {
// Valid Token then proceed request
const userId = token.get('Id');
const userPtr = token.get('userId');
const query = new Parse.Query('contracts_Users');
query.equalTo('UserId', { __type: 'Pointer', className: '_User', objectId: userId });
query.equalTo('UserId', userPtr);
query.exclude('IsContactEntry,TourStatus,UserRole,TenantId,UserId,CreatedBy,Plan');
const user = await query.first({ useMasterKey: true });
if (user) {
@@ -26,7 +26,7 @@ export default async function getUser(request, response) {
JobTitle: parseRes.JobTitle,
Company: parseRes.Company,
createdAt: parseRes.createdAt,
updateAt: parseRes.updateAt,
updatedAt: parseRes.updatedAt,
});
} else {
return response.status(404).json({ error: 'User not found!' });
@@ -8,16 +8,15 @@ export default async function updateDocument(request, response) {
tokenQuery.equalTo('token', reqToken);
const token = await tokenQuery.first({ useMasterKey: true });
if (token !== undefined) {
// Valid Token then proceed request
const id = token.get('Id');
// Valid Token then proceed request
const allowedKeys = ['Name', 'Note', 'Description'];
const objectKeys = Object.keys(request.body);
const isValid = objectKeys.every(key => allowedKeys.includes(key)) && objectKeys.length > 0;
if (isValid) {
const userId = { __type: 'Pointer', className: '_User', objectId: id };
const userPtr = token.get('userId');
const document = new Parse.Query('contracts_Document');
document.equalTo('objectId', request.params.document_id);
document.equalTo('CreatedBy', userId);
document.equalTo('CreatedBy', userPtr);
const res = await document.first({ useMasterKey: true });
if (res) {
const isArchive = res.get('IsArchive');
@@ -9,15 +9,14 @@ export default async function updateTemplate(request, response) {
const token = await tokenQuery.first({ useMasterKey: true });
if (token !== undefined) {
// Valid Token then proceed request
const id = token.get('Id');
const allowedKeys = ['Name', 'Note', 'Description'];
const objectKeys = Object.keys(request.body);
const isValid = objectKeys.every(key => allowedKeys.includes(key)) && objectKeys.length > 0;
if (isValid) {
const userId = { __type: 'Pointer', className: '_User', objectId: id };
const userPtr = token.get('userId');
const template = new Parse.Query('contracts_Template');
template.equalTo('objectId', request.params.template_id);
template.equalTo('CreatedBy', userId);
template.equalTo('CreatedBy', userPtr);
const res = await template.first({ useMasterKey: true });
if (res) {
const isArchive = res.get('IsArchive');
@@ -12,7 +12,7 @@ export default async function generateApiToken(request) {
const userId = userRes.data && userRes.data.objectId;
if (userId) {
const tokenQuery = new Parse.Query('appToken');
tokenQuery.equalTo('Id', userId);
tokenQuery.equalTo('userId', { __type: 'Pointer', className: '_User', objectId: userId });
const token = await tokenQuery.first({ useMasterKey: true });
if (token !== undefined) {
// return exsiting Token
@@ -31,7 +31,7 @@ export default async function generateApiToken(request) {
const appTokenQuery = new appToken();
const token = generateApiKey({ method: 'base62', prefix: 'opensign' });
appTokenQuery.set('token', token);
appTokenQuery.set('Id', userId);
appTokenQuery.set('userId', { __type: 'Pointer', className: '_User', objectId: userId });
const newRes = await appTokenQuery.save(null, { useMasterKey: true });
return newRes;
}
@@ -11,7 +11,7 @@ export default async function getapitoken(request) {
const userId = userRes.data && userRes.data.objectId;
if (userId) {
const tokenQuery = new Parse.Query('appToken');
tokenQuery.equalTo('Id', userId);
tokenQuery.equalTo('userId', { __type: 'Pointer', className: '_User', objectId: userId });
const res = await tokenQuery.first({ useMasterKey: true });
if (res) {
return { status: 'success', result: res.get('token') };
@@ -19,6 +19,11 @@ export default async function getapitoken(request) {
}
} catch (err) {
console.log('Err', err);
return { status: 'error', result: err };
console.log('err', err);
if (err.code == 209) {
return { error: 'Invalid session token' };
} else {
return { error: "You don't have access!" };
}
}
}
+1
View File
@@ -74,6 +74,7 @@ export const config = {
import('./cloud/main.js');
},
appId: process.env.APP_ID || 'myAppId',
maxLimit: 500,
masterKey: process.env.MASTER_KEY || '', //Add your master key here. Keep it secret!
masterKeyIps: ['0.0.0.0/0', '::1'], // '::1'
serverURL: process.env.SERVER_URL || 'http://localhost:8080/app', // Don't forget to change to https if needed