fix: pdf is not loading when custom file storage change

This commit is contained in:
prafull-opensignlabs
2024-10-08 20:09:38 +05:30
parent 23679e58e1
commit 761f81d27c
26 changed files with 294 additions and 210 deletions
@@ -2,20 +2,20 @@ import { useLocal } from '../../Utils.js';
import getPresignedUrl from './getSignedUrl.js';
async function DocumentAfterFind(request) {
if (useLocal !== 'true') {
if (request.objects.length === 1) {
if (request.objects) {
const obj = request.objects[0];
if (request.objects.length === 1) {
if (request.objects) {
const obj = request.objects[0];
const FileAdapterId = obj?.get('FileAdapterId') || '';
if (FileAdapterId || useLocal !== 'true') {
const SignedUrl = obj?.get('SignedUrl') && obj?.get('SignedUrl');
const Url = obj?.get('URL') && obj?.get('URL');
const certificateUrl = obj.get('CertificateUrl') && obj.get('CertificateUrl');
const IsFileAdapter = obj?.get('IsFileAdapter') || false;
let fileAdapter = {};
if (IsFileAdapter) {
if (FileAdapterId) {
const tenantId = obj?.get('ExtUserPtr')?.get('TenantId');
if (tenantId) {
const _tenantId = JSON.parse(JSON.stringify(obj?.get('ExtUserPtr')?.get('TenantId')));
fileAdapter = _tenantId?.FileAdapter || {};
fileAdapter = _tenantId?.FileAdapters?.find(x => x.id === FileAdapterId) || {};
}
}
if (SignedUrl) {
@@ -54,7 +54,7 @@ export default async function GetTemplate(request) {
const res = await template.first({ useMasterKey: true });
if (res) {
const templateRes = JSON.parse(JSON.stringify(res));
delete templateRes?.ExtUserPtr?.TenantId?.FileAdapter;
delete templateRes?.ExtUserPtr?.TenantId?.FileAdapters;
return templateRes;
} else {
return { error: "You don't have access of this document!" };
@@ -76,7 +76,7 @@ export default async function GetTemplate(request) {
// console.log("res ", res)
if (res) {
const templateRes = JSON.parse(JSON.stringify(res));
delete templateRes?.ExtUserPtr?.TenantId?.FileAdapter;
delete templateRes?.ExtUserPtr?.TenantId?.FileAdapters;
return templateRes;
} else {
return { error: "You don't have access of this document!" };
@@ -64,7 +64,7 @@ const createDocumentFromTemplate = async (template, existContact, index) => {
object.set('OriginIp', template?.OriginIp || '');
object.set('IsEnableOTP', template?.IsEnableOTP || false);
object.set('IsTourEnabled', template?.IsTourEnabled || false);
object.set('IsFileAdapter', template?.IsFileAdapter || false);
object.set('FileAdapterId', template?.FileAdapterId || '');
let signers = template?.Signers || [];
const signerobj = {
__type: 'Pointer',
@@ -6,29 +6,30 @@ async function TemplateAfterFind(request) {
if (request.objects.length === 1) {
if (request.objects) {
const obj = request.objects[0];
const SignedUrl = obj?.get('SignedUrl') && obj?.get('SignedUrl');
const Url = obj?.get('URL') && obj?.get('URL');
const certificateUrl = obj.get('CertificateUrl') && obj.get('CertificateUrl');
const IsFileAdapter = obj?.get('IsFileAdapter') || false;
let fileAdapter = {};
if (IsFileAdapter) {
const tenantId = obj?.get('ExtUserPtr')?.get('TenantId');
if (tenantId) {
const _tenantId = JSON.parse(JSON.stringify(obj?.get('ExtUserPtr')?.get('TenantId')));
fileAdapter = _tenantId?.FileAdapter || {};
const FileAdapterId = obj?.get('FileAdapterId') || '';
if (FileAdapterId || useLocal !== 'true') {
const SignedUrl = obj?.get('SignedUrl') && obj?.get('SignedUrl');
const Url = obj?.get('URL') && obj?.get('URL');
const certificateUrl = obj.get('CertificateUrl') && obj.get('CertificateUrl');
let fileAdapter = {};
if (FileAdapterId) {
const tenantId = obj?.get('ExtUserPtr')?.get('TenantId');
if (tenantId) {
const _tenantId = JSON.parse(JSON.stringify(obj?.get('ExtUserPtr')?.get('TenantId')));
fileAdapter = _tenantId?.FileAdapters?.find(x => x.id === FileAdapterId) || {};
}
}
if (SignedUrl) {
obj.set('SignedUrl', getPresignedUrl(SignedUrl, fileAdapter));
}
if (Url) {
obj.set('URL', getPresignedUrl(Url, fileAdapter));
}
if (certificateUrl) {
obj.set('CertificateUrl', getPresignedUrl(certificateUrl, fileAdapter));
}
return [obj];
}
if (SignedUrl) {
obj.set('SignedUrl', getPresignedUrl(SignedUrl, fileAdapter));
}
if (Url) {
obj.set('URL', getPresignedUrl(Url, fileAdapter));
}
if (certificateUrl) {
obj.set('CertificateUrl', getPresignedUrl(certificateUrl, fileAdapter));
}
return [obj];
}
}
}
@@ -1,7 +1,19 @@
// `generateId` is used to unique Id for fileAdapter
function generateId(length) {
const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
let result = '';
const charactersLength = characters.length;
for (let i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}
export default async function addFileAdapter(request) {
if (!request?.user) {
throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.');
}
const fileAdapterName = request.params.fileAdapterName;
const bucketName = request.params.bucketName;
const region = request.params.region;
const endpoint = request.params.endpoint;
@@ -10,24 +22,61 @@ export default async function addFileAdapter(request) {
const secretAccessKey = request.params.secretAccessKey;
const adapter = request.params.fileAdapter;
if (bucketName && region && endpoint && accessKeyId && secretAccessKey && adapter) {
if (fileAdapterName && accessKeyId && secretAccessKey && adapter) {
try {
const extUserCls = new Parse.Query('contracts_Users');
extUserCls.equalTo('UserId', request.user);
extUserCls.include('TenantId');
const extUser = await extUserCls.first({ useMasterKey: true });
if (extUser) {
const _extUser = JSON.parse(JSON.stringify(extUser));
const tenantCls = new Parse.Object('partners_Tenant');
tenantCls.id = extUser?.get('TenantId')?.id;
const adapterConfig = {
bucketName: bucketName,
region: region,
endpoint: endpoint,
baseUrl: baseUrl,
accessKeyId: accessKeyId,
secretAccessKey: secretAccessKey,
};
tenantCls.set('FileAdapter', adapterConfig);
tenantCls.set('ActiveFileAdapter', adapter);
const existsFileAdaptes = _extUser?.TenantId?.FileAdapters
? _extUser?.TenantId?.FileAdapters
: [];
// assign existing file adapters or empty array
let updatedFileAdapters = existsFileAdaptes;
const uniqueId = generateId(10);
const id = extUser?.get('TenantId')?.id + '_' + uniqueId;
const index = updatedFileAdapters?.findIndex(x => x.fileAdapterName === fileAdapterName);
if (index !== -1) {
// If an object with the same fileAdapterName exists, update it
if (bucketName || region || endpoint || baseUrl) {
throw new Parse.Error(
Parse.Error.INVALID_QUERY,
'Cannot update bucketName, region, endpoint, baseUrl.'
);
} else {
const adapterConfig = { accessKeyId: accessKeyId, secretAccessKey: secretAccessKey };
updatedFileAdapters[index] = { ...updatedFileAdapters[index], ...adapterConfig };
}
} else {
if (bucketName && region && endpoint && baseUrl) {
// If the object with the given fileAdapterName doesn't exist, add a new one
updatedFileAdapters.push({
id: id,
fileAdapterName: fileAdapterName,
fileAdapter: adapter,
bucketName: bucketName,
region: region,
endpoint: endpoint,
baseUrl: baseUrl,
accessKeyId: accessKeyId,
secretAccessKey: secretAccessKey,
});
} else {
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'Please provide all parameters.');
}
}
tenantCls.set('FileAdapters', updatedFileAdapters);
if (adapter) {
tenantCls.set('ActiveFileAdapter', id);
} else {
tenantCls.unset('ActiveFileAdapter');
}
const updateTenant = await tenantCls.save(null, { useMasterKey: true });
const tenantSchema = new Parse.Schema('partners_Tenant');
tenantSchema.setCLP({
@@ -38,12 +87,46 @@ export default async function addFileAdapter(request) {
update: { '*': true },
delete: { '*': true },
addField: { '*': true },
protectedFields: { '*': ['FileAdapter'] },
protectedFields: { '*': ['FileAdapters'] },
});
await tenantSchema.update();
return updateTenant.updatedAt;
} else {
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'User not found.');
}
} catch (err) {
console.log('Err in add custom file adapter', err);
const code = err.code || 400;
const msg = err.message || 'Something went wrong.';
throw new Parse.Error(code, msg);
}
} else if (adapter === 'opensign') {
try {
const extUserCls = new Parse.Query('contracts_Users');
extUserCls.equalTo('UserId', request.user);
extUserCls.include('TenantId');
const extUser = await extUserCls.first({ useMasterKey: true });
if (extUser) {
const tenantCls = new Parse.Object('partners_Tenant');
tenantCls.id = extUser?.get('TenantId')?.id;
tenantCls.unset('ActiveFileAdapter');
const updateTenant = await tenantCls.save(null, { useMasterKey: true });
const tenantSchema = new Parse.Schema('partners_Tenant');
tenantSchema.setCLP({
get: { '*': true },
find: { '*': true },
count: { '*': true },
create: { '*': true },
update: { '*': true },
delete: { '*': true },
addField: { '*': true },
protectedFields: { '*': ['FileAdapters'] },
});
await tenantSchema.update();
return updateTenant.updatedAt;
} else {
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'User not found.');
}
return extUser;
} catch (err) {
console.log('Err in add custom file adapter', err);
const code = err.code || 400;
@@ -202,7 +202,7 @@ export default async function createBatchDocs(request) {
DocSentAt: { __type: 'Date', iso: isoDate },
IsEnableOTP: x?.IsEnableOTP || false,
IsTourEnabled: x?.IsTourEnabled || false,
IsFileAdapter: x?.IsFileAdapter || false,
FileAdapterId: x?.FileAdapterId || '',
},
};
});
@@ -22,7 +22,7 @@ export default async function getDocument(request) {
if (res) {
const IsEnableOTP = res?.get('IsEnableOTP') || false;
const document = JSON.parse(JSON.stringify(res));
delete document.ExtUserPtr.TenantId.FileAdapter;
delete document.ExtUserPtr.TenantId.FileAdapters;
if (!IsEnableOTP) {
return document;
} else {
@@ -9,17 +9,26 @@ export default async function getFileAdapter(request) {
const extUser = await extUserCls.first({ useMasterKey: true });
if (extUser) {
const _extUser = JSON.parse(JSON.stringify(extUser));
if (_extUser?.TenantId?.ActiveFileAdapter && _extUser?.TenantId?.FileAdapter?.bucketName) {
const adapterConfig = {
bucketName: _extUser?.TenantId?.FileAdapter?.bucketName,
region: _extUser?.TenantId?.FileAdapter?.region,
endpoint: _extUser?.TenantId?.FileAdapter?.endpoint,
baseUrl: _extUser?.TenantId?.FileAdapter?.baseUrl,
accessKeyId: _extUser?.TenantId?.FileAdapter?.accessKeyId,
secretAccessKey: _extUser?.TenantId?.FileAdapter?.secretAccessKey,
fileAdapter: _extUser?.TenantId?.ActiveFileAdapter,
};
return adapterConfig;
const isFileAdapter = _extUser?.TenantId?.FileAdapters?.length > 0 ? true : false;
if (_extUser?.TenantId?.ActiveFileAdapter && isFileAdapter) {
const lastIndex = _extUser?.TenantId?.FileAdapters?.length - 1;
const lastObj = _extUser?.TenantId?.FileAdapters[lastIndex];
if (lastIndex >= 0) {
const adapterConfig = {
id: lastObj?.id,
fileAdapterName: lastObj?.fileAdapterName,
bucketName: lastObj?.bucketName,
region: lastObj?.region,
endpoint: lastObj?.endpoint,
baseUrl: lastObj?.baseUrl,
accessKeyId: lastObj?.accessKeyId,
secretAccessKey: lastObj?.secretAccessKey,
fileAdapter: lastObj?.fileAdapter,
};
return adapterConfig;
} else {
return {};
}
} else {
return {};
}
@@ -31,10 +31,10 @@ export async function getSignedUrl(request) {
const docId = request.params.docId || '';
const templateId = request.params.templateId || '';
const url = request.params.url;
const IsFileAdapter = request.params.isFileAdapter || '';
const fileAdapterId = request.params.fileAdapterId || '';
if (docId || templateId) {
try {
if (useLocal !== 'true') {
if (fileAdapterId || useLocal !== 'true') {
const query = new Parse.Query(docId ? 'contracts_Document' : 'contracts_Template');
query.equalTo('objectId', docId ? docId : templateId);
query.include('ExtUserPtr.TenantId');
@@ -50,23 +50,23 @@ export async function getSignedUrl(request) {
);
} else {
let adapterConfig = {};
if (IsFileAdapter) {
// `FileAdapter` && `ActiveFileAdapter` is used to save file in user's fileAdapter
const FileAdapter = _resDoc?.ExtUserPtr?.TenantId?.FileAdapter;
const ActiveFileAdapter = _resDoc?.ExtUserPtr?.TenantId?.ActiveFileAdapter;
if (FileAdapter && ActiveFileAdapter) {
adapterConfig = { ActiveFileAdapter: ActiveFileAdapter, ...FileAdapter };
}
if (fileAdapterId) {
// `adapterConfig` is used to get file in user's fileAdapter
adapterConfig =
_resDoc?.ExtUserPtr?.TenantId?.FileAdapters?.find(
x => x.id === fileAdapterId
) || {};
}
const presignedUrl = getPresignedUrl(url, adapterConfig);
return presignedUrl;
}
} else {
const FileAdapter = _resDoc?.ExtUserPtr?.TenantId?.FileAdapter;
const ActiveFileAdapter = _resDoc?.ExtUserPtr?.TenantId?.ActiveFileAdapter;
let adapterConfig = {};
if (FileAdapter && ActiveFileAdapter) {
adapterConfig = { ActiveFileAdapter: ActiveFileAdapter, ...FileAdapter };
if (fileAdapterId) {
// `adapterConfig` is used to get file in user's fileAdapter
adapterConfig =
_resDoc?.ExtUserPtr?.TenantId?.FileAdapters?.find(x => x.id === fileAdapterId) ||
{};
}
const presignedUrl = getPresignedUrl(url, adapterConfig);
return presignedUrl;
@@ -14,7 +14,7 @@ async function getUserDetails(request) {
userQuery.include('UserId');
userQuery.include('CreatedBy');
userQuery.exclude('CreatedBy.authData');
userQuery.exclude('TenantId.FileAdapter');
userQuery.exclude('TenantId.FileAdapters');
userQuery.exclude('google_refresh_token');
if (userId) {
userQuery.equalTo('CreatedBy', { __type: 'Pointer', className: '_User', objectId: userId });
@@ -19,7 +19,8 @@ async function uploadFile(pdfName, filepath, adapter) {
let fileUrl;
if (adapter?.bucketName) {
const adapterConfig = {
fileAdapter: adapter?.ActiveFileAdapter,
id: adapter?.id,
fileAdapter: adapter?.fileAdapter,
bucketName: adapter?.bucketName,
region: adapter?.region,
endpoint: adapter?.endpoint,
@@ -311,8 +312,9 @@ async function PDF(req) {
}
const _resDoc = resDoc?.toJSON();
// `FileAdapter` && `ActiveFileAdapter` is used to save file in user's fileAdapter
const FileAdapter = _resDoc?.ExtUserPtr?.TenantId?.FileAdapter;
const ActiveFileAdapter = _resDoc?.ExtUserPtr?.TenantId?.ActiveFileAdapter;
const FileAdapter =
_resDoc?.ExtUserPtr?.TenantId?.FileAdapters?.find(x => x.id === ActiveFileAdapter) || {};
let adapterConfig = {};
if (FileAdapter && ActiveFileAdapter) {
adapterConfig = { ActiveFileAdapter: ActiveFileAdapter, ...FileAdapter };
@@ -29,7 +29,7 @@ export default function reportJson(id, userId) {
'Signers.Phone',
'Placeholders',
'IsSignyourself',
'IsFileAdapter',
'FileAdapterId',
],
};
@@ -75,7 +75,7 @@ export default function reportJson(id, userId) {
'AuditTrail',
'Placeholders',
'SignedUrl',
'IsFileAdapter',
'FileAdapterId',
],
};
// In progess report
@@ -115,7 +115,7 @@ export default function reportJson(id, userId) {
'SendMail',
'Placeholders',
'SignedUrl',
'IsFileAdapter',
'FileAdapterId',
],
};
// completed documents report
@@ -147,7 +147,7 @@ export default function reportJson(id, userId) {
'Placeholders',
'IsSignyourself',
'IsCompleted',
'IsFileAdapter',
'FileAdapterId',
],
};
// declined documents report
@@ -177,7 +177,7 @@ export default function reportJson(id, userId) {
'Placeholders',
'DeclineReason',
'SignedUrl',
'IsFileAdapter',
'FileAdapterId',
],
};
// Expired Documents report
@@ -210,7 +210,7 @@ export default function reportJson(id, userId) {
'Signers.Phone',
'Placeholders',
'SignedUrl',
'IsFileAdapter',
'FileAdapterId',
],
};
// Recently sent for signatures report show on dashboard
@@ -248,7 +248,7 @@ export default function reportJson(id, userId) {
'ExpiryDate',
'Placeholders',
'SignedUrl',
'IsFileAdapter',
'FileAdapterId',
],
};
// Recent signature requests report show on dashboard
@@ -291,7 +291,7 @@ export default function reportJson(id, userId) {
'Signers.Phone',
'Placeholders',
'SignedUrl',
'IsFileAdapter',
'FileAdapterId',
],
};
// Drafts report show on dashboard
@@ -320,7 +320,7 @@ export default function reportJson(id, userId) {
'Signers.Email',
'Signers.Phone',
'Placeholders',
'IsFileAdapter',
'FileAdapterId',
],
};
// contact book report
@@ -361,7 +361,7 @@ export default function reportJson(id, userId) {
'IsPublic',
'SharedWith.Name',
'SendinOrder',
'IsFileAdapter',
'FileAdapterId',
],
};
default:
@@ -9,6 +9,7 @@ export default async function saveToFileAdapter(request) {
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'Please provide file.');
}
const fileBase64 = request.params.fileBase64;
const id = request.params.id;
try {
const extCls = new Parse.Query('contracts_Users');
extCls.equalTo('UserId', request.user);
@@ -16,16 +17,18 @@ export default async function saveToFileAdapter(request) {
const resExt = await extCls.first({ useMasterKey: true });
if (resExt) {
const _resExt = JSON.parse(JSON.stringify(resExt));
if (_resExt?.TenantId.FileAdapter?.accessKeyId) {
const fileAdapters = _resExt?.TenantId.FileAdapters || [];
const fileAdapter = fileAdapters?.find(x => x.id === id) || {};
if (fileAdapter?.accessKeyId) {
const adapterConfig = {
fileAdapter: _resExt?.TenantId?.ActiveFileAdapter,
bucketName: _resExt?.TenantId?.FileAdapter?.bucketName,
region: _resExt?.TenantId?.FileAdapter?.region,
endpoint: _resExt?.TenantId?.FileAdapter?.endpoint,
accessKeyId: _resExt?.TenantId?.FileAdapter?.accessKeyId,
secretAccessKey: _resExt?.TenantId?.FileAdapter?.secretAccessKey,
baseUrl: _resExt?.TenantId?.FileAdapter?.baseUrl,
id: id,
fileAdapter: fileAdapter?.fileAdapter,
bucketName: fileAdapter?.bucketName,
region: fileAdapter?.region,
endpoint: fileAdapter?.endpoint,
accessKeyId: fileAdapter?.accessKeyId,
secretAccessKey: fileAdapter?.secretAccessKey,
baseUrl: fileAdapter?.baseUrl,
};
const buffer = Buffer.from(fileBase64, 'base64');
const fileName = request.params.fileName;
@@ -37,7 +37,8 @@ const makeEmail = async (to, from, subject, html, url, pdfName) => {
let Pdf = fs.createWriteStream('test.pdf');
const writeToLocalDisk = () => {
return new Promise((resolve, reject) => {
if (useLocal !== 'true') {
const isSecure = new URL(url)?.protocol === 'https:';
if (useLocal !== 'true' || isSecure) {
https.get(url, async function (response) {
response.pipe(Pdf);
response.on('end', () => resolve('success'));
@@ -33,7 +33,8 @@ async function sendMailProvider(req, plan, monthchange) {
let Pdf = fs.createWriteStream('test.pdf');
const writeToLocalDisk = () => {
return new Promise((resolve, reject) => {
if (useLocal !== 'true') {
const isSecure = new URL(url)?.protocol === 'https:';
if (useLocal !== 'true' || isSecure) {
https.get(req.params.url, async function (response) {
response.pipe(Pdf);
response.on('end', () => resolve('success'));
@@ -199,7 +200,8 @@ async function sendcustomsmtp(extRes, req) {
let Pdf = fs.createWriteStream('test.pdf');
const writeToLocalDisk = () => {
return new Promise((resolve, reject) => {
if (useLocal !== 'true') {
const isSecure = new URL(url)?.protocol === 'https:';
if (useLocal !== 'true' || isSecure) {
https.get(req.params.url, async function (response) {
response.pipe(Pdf);
response.on('end', () => resolve('success'));