Merge pull request #1422 from OpenSignLabs/validation

feat: add functionality to enable/disable signature types
This commit is contained in:
prafull-opensignlabs
2024-11-07 14:15:27 +05:30
committed by GitHub
28 changed files with 1300 additions and 677 deletions
+2
View File
@@ -83,6 +83,7 @@ import isUserInContactBook from './parsefunction/isUserInContactBook.js';
import updateTourStatus from './parsefunction/updateTourStatus.js';
import saveTemplate from './parsefunction/saveTemplate.js';
import updateToPublicTemplate from './parsefunction/updateToPublicTemplate.js';
import updateSignatureType from './parsefunction/updatesignaturetype.js';
// This afterSave function triggers after an object is added or updated in the specified class, allowing for post-processing logic.
Parse.Cloud.afterSave('contracts_Document', DocumentAftersave);
@@ -178,3 +179,4 @@ Parse.Cloud.define('savecontact', savecontact);
Parse.Cloud.define('isuserincontactbook', isUserInContactBook);
Parse.Cloud.define('updatetourstatus', updateTourStatus);
Parse.Cloud.define('updatetopublictemplate', updateToPublicTemplate);
Parse.Cloud.define('updatesignaturetype', updateSignatureType);
@@ -82,6 +82,7 @@ export default async function GetTemplate(request) {
template.include('Signers');
template.include('CreatedBy');
template.include('ExtUserPtr.TenantId');
template.include('Placeholders.signerPtr');
}
}
const res = await template.first({ useMasterKey: true });
@@ -251,6 +251,7 @@ async function batchQuery(userId, Documents, Ip, parseConfig) {
IsEnableOTP: x?.IsEnableOTP || false,
IsTourEnabled: x?.IsTourEnabled || false,
FileAdapterId: x?.FileAdapterId || '',
...(x?.SignatureType ? { SignatureType: x?.SignatureType } : {}),
},
};
});
@@ -1,29 +1,48 @@
import { parseJwt } from '../../Utils.js';
import jwt from 'jsonwebtoken';
async function getTenantByUserId(userId) {
async function getTenantByUserId(userId, contactId) {
try {
const query = new Parse.Query('contracts_Users');
query.equalTo('UserId', {
__type: 'Pointer',
className: '_User',
objectId: userId,
});
const extuser = await query.first({ useMasterKey: true });
if (extuser) {
const user = extuser?.get('CreatedBy')?.id || userId;
const tenantCreditsQuery = new Parse.Query('partners_Tenant');
tenantCreditsQuery.equalTo('UserId', {
if (contactId) {
const contactquery = new Parse.Query('contracts_Contactbook');
contactquery.equalTo('objectId', contactId);
const contactuser = await contactquery.first({ useMasterKey: true });
if (contactuser) {
const user = contactuser?.get('CreatedBy')?.id || userId;
const tenantCreditsQuery = new Parse.Query('partners_Tenant');
tenantCreditsQuery.equalTo('UserId', {
__type: 'Pointer',
className: '_User',
objectId: user,
});
tenantCreditsQuery.exclude('FileAdapters,PfxFile,ContactNumber');
const res = await tenantCreditsQuery.first({ useMasterKey: true });
return res;
} else {
return {};
}
} else {
const query = new Parse.Query('contracts_Users');
query.equalTo('UserId', {
__type: 'Pointer',
className: '_User',
objectId: user,
objectId: userId,
});
tenantCreditsQuery.exclude('FileAdapters');
tenantCreditsQuery.exclude('PfxFile');
const res = await tenantCreditsQuery.first({ useMasterKey: true });
return res;
} else {
return {};
const extuser = await query.first({ useMasterKey: true });
if (extuser) {
const user = extuser?.get('CreatedBy')?.id || userId;
const tenantCreditsQuery = new Parse.Query('partners_Tenant');
tenantCreditsQuery.equalTo('UserId', {
__type: 'Pointer',
className: '_User',
objectId: user,
});
tenantCreditsQuery.exclude('FileAdapters,PfxFile');
const res = await tenantCreditsQuery.first({ useMasterKey: true });
return res;
} else {
return {};
}
}
} catch (err) {
console.log('err in getTenant ', err);
@@ -33,6 +52,7 @@ async function getTenantByUserId(userId) {
export default async function getTenant(request) {
const jwttoken = request.headers.jwttoken || '';
const userId = request.params.userId || '';
const contactId = request.params.contactId || '';
if (jwttoken) {
const jwtDecode = parseJwt(jwttoken);
if (jwtDecode?.user_email) {
@@ -50,12 +70,14 @@ export default async function getTenant(request) {
const appRes = await tokenQuery.first({ useMasterKey: true });
const decoded = jwt.verify(verifyToken, appRes?.get('token'));
if (decoded?.user_email) {
return await getTenantByUserId(apiUserId);
return await getTenantByUserId(apiUserId, contactId);
} else {
return { status: 'error', result: 'Invalid token!' };
}
}
} else if (userId) {
return await getTenantByUserId(userId);
} else if (userId || contactId) {
return await getTenantByUserId(userId, contactId);
} else {
return {};
}
}
@@ -0,0 +1,44 @@
export default async function updateSignatureType(request) {
if (!request?.user) {
throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.');
}
const SignatureType = request.params.SignatureType || [];
if (SignatureType.length > 0) {
const isEnabled = SignatureType.some(x => x.enabled === true);
if (isEnabled) {
try {
const orgQuery = new Parse.Query('contracts_Users');
orgQuery.equalTo('UserId', {
__type: 'Pointer',
className: '_User',
objectId: request.user.id,
});
const resUser = await orgQuery.first({ useMasterKey: true });
if (resUser) {
const newOrg = new Parse.Object('contracts_Users');
newOrg.id = resUser.id;
newOrg.set('SignatureType', SignatureType);
const updateUserRes = await newOrg.save(null, { useMasterKey: true });
if (updateUserRes) {
const _updateUserRes = JSON.parse(JSON.stringify(updateUserRes));
return _updateUserRes;
}
} else {
throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, 'Premission denied.');
}
} catch (err) {
console.log('err in addorganization', err);
const code = err?.code || 400;
const msg = err?.message || 'Something went wrong.';
throw new Parse.Error(code, msg);
}
} else {
throw new Parse.Error(
Parse.Error.INVALID_QUERY,
'At least one signature type should be enabled.'
);
}
} else {
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'Please provide signature types.');
}
}
@@ -0,0 +1,43 @@
/**
*
* @param {Parse} Parse
*/
exports.up = async Parse => {
const docSchema = new Parse.Schema('contracts_Document');
docSchema.addArray('SignatureType');
await docSchema.update();
const templateSchema = new Parse.Schema('contracts_Template');
templateSchema.addArray('SignatureType');
await templateSchema.update();
const extUserSchema = new Parse.Schema('contracts_Users');
extUserSchema.addArray('SignatureType');
await extUserSchema.update();
const tenantSchema = new Parse.Schema('partners_Tenant');
tenantSchema.addArray('SignatureType');
return tenantSchema.update();
};
/**
*
* @param {Parse} Parse
*/
exports.down = async Parse => {
const docSchema = new Parse.Schema('contracts_Document');
docSchema.deleteField('SignatureType');
await docSchema.update();
const templateSchema = new Parse.Schema('contracts_Template');
docSchema.deleteField('SignatureType');
await templateSchema.update();
const extUserSchema = new Parse.Schema('contracts_Users');
docSchema.deleteField('SignatureType');
await extUserSchema.update();
const tenantSchema = new Parse.Schema('partners_Tenant');
docSchema.deleteField('SignatureType');
return tenantSchema.update();
};