Merge pull request #1309 from OpenSignLabs/validation

This commit is contained in:
Andrew
2024-10-08 20:14:26 +05:30
committed by GitHub
26 changed files with 294 additions and 210 deletions
@@ -31,14 +31,14 @@ function EmailComponent({
setIsLoading(true);
let sendMail;
const docId = pdfDetails?.[0]?.objectId || "";
const isFileAdapter = pdfDetails?.[0]?.IsFileAdapter
? pdfDetails?.[0]?.IsFileAdapter
: false;
const FileAdapterId = pdfDetails?.[0]?.FileAdapterId
? pdfDetails?.[0]?.FileAdapterId
: "";
let presignedUrl = pdfUrl;
try {
const axiosRes = await axios.post(
`${localStorage.getItem("baseUrl")}/functions/getsignedurl`,
{ url: pdfUrl, docId: docId, isFileAdapter: isFileAdapter },
{ url: pdfUrl, docId: docId, fileAdapterId: FileAdapterId },
{
headers: {
"content-type": "Application/json",
+11 -11
View File
@@ -712,7 +712,7 @@ export const createDocument = async (
RemindOnceInEvery: parseInt(Doc?.RemindOnceInEvery || 5),
IsEnableOTP: Doc?.IsEnableOTP || false,
IsTourEnabled: Doc?.IsTourEnabled || false,
IsFileAdapter: Doc?.IsFileAdapter || false
FileAdapterId: Doc?.FileAdapterId || ""
};
try {
@@ -2074,7 +2074,7 @@ export const fetchUrl = async (url, pdfName) => {
export const getSignedUrl = async (
pdfUrl,
docId,
isFileAdapter,
fileAdapterId,
templateId
) => {
//use only axios here due to public template sign
@@ -2083,7 +2083,7 @@ export const getSignedUrl = async (
{
url: pdfUrl,
docId: docId || "",
isFileAdapter: isFileAdapter,
fileAdapterId: fileAdapterId,
templateId: templateId || ""
},
{
@@ -2103,11 +2103,11 @@ export const handleDownloadPdf = async (pdfDetails, setIsDownloading) => {
const pdfUrl = pdfDetails?.[0]?.SignedUrl || pdfDetails?.[0]?.URL;
setIsDownloading && setIsDownloading("pdf");
const docId = pdfDetails?.[0]?.objectId || "";
const isFileAdapter = pdfDetails?.[0]?.IsFileAdapter
? pdfDetails?.[0]?.IsFileAdapter
: false;
const fileAdapterId = pdfDetails?.[0]?.FileAdapterId
? pdfDetails?.[0]?.FileAdapterId
: "";
try {
const url = await getSignedUrl(pdfUrl, docId, isFileAdapter);
const url = await getSignedUrl(pdfUrl, docId, fileAdapterId);
await fetchUrl(url, pdfName);
setIsDownloading && setIsDownloading("");
} catch (err) {
@@ -2131,16 +2131,16 @@ export const handleToPrint = async (
event.preventDefault();
setIsDownloading("pdf");
const docId = pdfDetails?.[0]?.objectId || "";
const isFileAdapter = pdfDetails?.[0]?.IsFileAdapter
? pdfDetails?.[0]?.IsFileAdapter
: false;
const FileAdapterId = pdfDetails?.[0]?.FileAdapterId
? pdfDetails?.[0]?.FileAdapterId
: "";
try {
// const url = await Parse.Cloud.run("getsignedurl", { url: pdfUrl });
//`localStorage.getItem("baseUrl")` is also use in public-profile flow for public-sign
//if we give this `appInfo.baseUrl` as a base url then in public-profile it will create base url of it's window.location.origin ex- opensign.me which is not base url
const axiosRes = await axios.post(
`${localStorage.getItem("baseUrl")}/functions/getsignedurl`,
{ url: pdfUrl, docId: docId, isFileAdapter: isFileAdapter },
{ url: pdfUrl, docId: docId, fileAdapterId: FileAdapterId },
{
headers: {
"content-type": "Application/json",
+6 -16
View File
@@ -224,23 +224,13 @@ const HomeLayout = () => {
async function checkTourStatus() {
const cloudRes = await Parse.Cloud.run("getUserDetails");
const res = { data: cloudRes.toJSON() };
if (res.data && res.data.TourStatus && res.data.TourStatus.length > 0) {
const tourStatus = res.data.TourStatus;
// console.log("res ", res.data.TourStatus);
if (cloudRes) {
const extUser = JSON.parse(JSON.stringify(cloudRes));
localStorage.setItem("Extand_Class", JSON.stringify([extUser]));
const tourStatus = extUser?.TourStatus || [];
setTourStatusArr(tourStatus);
const filteredtourStatus = tourStatus.filter((obj) => obj["loginTour"]);
if (filteredtourStatus.length > 0) {
const loginTour = filteredtourStatus[0]["loginTour"];
// console.log("loginTour", loginTour);
if (loginTour) {
setIsTour(false);
} else {
setIsTour(true);
}
} else {
setIsTour(true);
}
const loginTour = tourStatus.find((obj) => obj.loginTour)?.loginTour;
setIsTour(!loginTour);
} else {
setIsTour(true);
}
+35 -13
View File
@@ -169,13 +169,16 @@ const Forms = (props) => {
});
setIsDecrypting(false);
setfileload(true);
if (extUserData?.TenantId?.ActiveFileAdapter) {
const fileAdapterId =
extUserData?.TenantId?.ActiveFileAdapter || "";
if (fileAdapterId) {
const base64 = await toDataUrl(pdfFile);
const fileBase64 = base64.split(",").pop();
const ext = files?.[0]?.name?.split(".").pop();
const fileRes = await saveToCustomFile(
fileBase64,
`${name}.${ext}`
`${name}.${ext}`,
fileAdapterId
);
if (fileRes.url) {
setFileUpload(fileRes.url);
@@ -263,7 +266,9 @@ const Forms = (props) => {
});
const size = files?.[0]?.size;
const name = generatePdfName(16);
if (extUserData?.TenantId?.ActiveFileAdapter) {
const fileAdapterId =
extUserData?.TenantId?.ActiveFileAdapter || "";
if (fileAdapterId) {
const base64 = await pdfDoc.saveAsBase64({
useObjectStreams: false
});
@@ -272,7 +277,8 @@ const Forms = (props) => {
const ext = files?.[0]?.name?.split(".").pop();
const fileRes = await saveToCustomFile(
fileBase64,
`${name}.${ext}`
`${name}.${ext}`,
fileAdapterId
);
if (fileRes.url) {
setFileUpload(fileRes.url);
@@ -373,11 +379,12 @@ const Forms = (props) => {
}
};
const saveToCustomFile = async (base64, filname) => {
const saveToCustomFile = async (base64, filename, fileAdapterId) => {
try {
const savetos3 = await Parse.Cloud.run("savetofileadapter", {
fileBase64: base64,
fileName: filname
fileName: filename,
id: fileAdapterId
});
return { url: savetos3.url };
} catch (err) {
@@ -391,11 +398,16 @@ const Forms = (props) => {
const size = file.size;
const name = generatePdfName(16);
const pdfFile = file;
if (extUserData?.TenantId?.ActiveFileAdapter) {
const fileAdapterId = extUserData?.TenantId?.ActiveFileAdapter || "";
if (fileAdapterId) {
const base64 = await toDataUrl(file);
const fileBase64 = base64.split(",").pop();
const ext = file?.name?.split(".").pop();
const fileRes = await saveToCustomFile(fileBase64, `${name}.${ext}`);
const fileRes = await saveToCustomFile(
fileBase64,
`${name}.${ext}`,
fileAdapterId
);
if (fileRes.url) {
setFileUpload(fileRes?.url);
const tenantId = localStorage.getItem("TenantId");
@@ -459,11 +471,16 @@ const Forms = (props) => {
return;
} else {
const name = generatePdfName(16);
if (extUserData?.TenantId?.ActiveFileAdapter) {
const fileAdapterId = extUserData?.TenantId?.ActiveFileAdapter || "";
if (fileAdapterId) {
const base64 = await uriToBase64(url);
const fileBase64 = base64.split(",").pop();
const ext = file?.name?.split(".").pop();
const fileRes = await saveToCustomFile(fileBase64, `${name}.${ext}`);
const fileRes = await saveToCustomFile(
fileBase64,
`${name}.${ext}`,
fileAdapterId
);
if (fileRes.url) {
setFileUpload(fileRes.url);
setfileload(false);
@@ -558,7 +575,7 @@ const Forms = (props) => {
objectId: ExtCls[0].objectId
});
if (extUserData?.TenantId?.ActiveFileAdapter) {
object.set("IsFileAdapter", true);
object.set("FileAdapterId", extUserData?.TenantId?.ActiveFileAdapter);
}
const res = await object.save();
if (res) {
@@ -664,12 +681,17 @@ const Forms = (props) => {
type: "application/pdf"
});
setIsDecrypting(false);
const fileAdapterId = extUserData?.TenantId?.ActiveFileAdapter || "";
// Upload the file to Parse Server
if (extUserData?.TenantId?.ActiveFileAdapter) {
if (fileAdapterId) {
const base64 = await toDataUrl(pdfFile);
const fileBase64 = base64.split(",").pop();
const ext = formData?.file?.name?.split(".").pop();
const fileRes = await saveToCustomFile(fileBase64, `${name}.${ext}`);
const fileRes = await saveToCustomFile(
fileBase64,
`${name}.${ext}`,
fileAdapterId
);
if (fileRes.url) {
setFormData((prev) => ({ ...prev, password: "" }));
setFileUpload(fileRes?.url);
+6 -15
View File
@@ -499,22 +499,13 @@ function Opensigndrive() {
//function to use check tour status of open sign drive
async function checkTourStatus() {
const cloudRes = await Parse.Cloud.run("getUserDetails");
const res = { data: cloudRes.toJSON() };
if (res.data && res.data.TourStatus && res.data.TourStatus.length > 0) {
const tourStatus = res.data.TourStatus;
if (cloudRes) {
const extUser = JSON.parse(JSON.stringify(cloudRes));
localStorage.setItem("Extand_Class", JSON.stringify([extUser]));
const tourStatus = extUser?.TourStatus || [];
setTourStatusArr(tourStatus);
const filteredtourStatus = tourStatus.filter((obj) => obj["driveTour"]);
if (filteredtourStatus.length > 0) {
const driveTour = filteredtourStatus[0]["driveTour"];
// console.log("loginTour", loginTour);
if (driveTour) {
setIsTour(false);
} else {
setIsTour(true);
}
} else {
setIsTour(true);
}
const driveTour = tourStatus.find((obj) => obj.driveTour)?.driveTour;
setIsTour(!driveTour);
} else {
setIsTour(true);
}
@@ -35,11 +35,11 @@ function DownloadPdfZip(props) {
try {
// Fetch the first PDF (Signed Document)
const docId = pdfDetails?.[0]?.objectId || "";
const isFileAdapter = pdfDetails?.[0]?.IsFileAdapter
? pdfDetails?.[0]?.IsFileAdapter
: false;
const fileAdapterId = pdfDetails?.[0]?.FileAdapterId
? pdfDetails?.[0]?.FileAdapterId
: "";
console.log("pdfDetails?.[0] ", pdfDetails?.[0]);
const signedUrl = await getSignedUrl(pdfUrl, docId, isFileAdapter);
const signedUrl = await getSignedUrl(pdfUrl, docId, fileAdapterId);
console.log("signedUrl ", signedUrl);
const pdf1Response = await fetch(signedUrl);
if (!pdf1Response.ok) {
@@ -275,9 +275,7 @@ const ReportTable = (props) => {
AutomaticReminders: Doc?.AutomaticReminders || false,
RemindOnceInEvery: Doc?.RemindOnceInEvery || 5,
IsEnableOTP: Doc?.IsEnableOTP || false,
IsTourEnabled: Doc?.IsTourEnabled || false,
IsFileAdapter: Doc?.IsFileAdapter || false
FileAdapterId: Doc?.FileAdapterId || ""
};
try {
const res = await axios.post(
@@ -605,25 +603,15 @@ const ReportTable = (props) => {
async function checkTourStatus() {
const cloudRes = await Parse.Cloud.run("getUserDetails");
const res = { data: cloudRes.toJSON() };
if (res.data && res.data.TourStatus && res.data.TourStatus.length > 0) {
const tourStatus = res.data.TourStatus;
// console.log("res ", res.data.TourStatus);
if (cloudRes) {
const extUser = JSON.parse(JSON.stringify(cloudRes));
localStorage.setItem("Extand_Class", JSON.stringify([extUser]));
const tourStatus = extUser?.TourStatus || [];
setTourStatusArr(tourStatus);
const filteredtourStatus = tourStatus.filter(
(obj) => obj["templateTour"]
);
if (filteredtourStatus.length > 0) {
const templateTour = filteredtourStatus[0]["templateTour"];
if (templateTour) {
setIsTour(false);
} else {
setIsTour(true);
}
} else {
setIsTour(true);
}
const templateTour = tourStatus.find(
(obj) => obj.templateTour
)?.templateTour;
setIsTour(!templateTour);
} else {
setIsTour(true);
}
@@ -676,7 +664,7 @@ const ReportTable = (props) => {
const isCompleted = item?.IsCompleted || false;
const templateId = props?.ReportName === "Templates" && item.objectId;
const docId = props?.ReportName !== "Templates" && item.objectId;
const isFileAdapter = item?.IsFileAdapter ? item?.IsFileAdapter : false;
const fileAdapterId = item?.FileAdapterId ? item?.FileAdapterId : "";
if (url) {
try {
@@ -686,7 +674,7 @@ const ReportTable = (props) => {
const signedUrl = await getSignedUrl(
url,
docId,
isFileAdapter,
fileAdapterId,
templateId
);
await fetchUrl(signedUrl, pdfName);
@@ -213,7 +213,9 @@ export default async function createDocumentWithTemplate(request, response) {
if (folderId) {
object.set('Folder', folderPtr);
}
object.set('IsFileAdapter', template?.IsFileAdapter || false);
if (template?.FileAdapterId) {
object.set('FileAdapterId');
}
const newACL = new Parse.ACL();
newACL.setPublicReadAccess(false);
newACL.setPublicWriteAccess(false);
@@ -130,16 +130,13 @@ export default async function createDocumentwithCoordinate(request, response) {
saveFileUsage(buffer.length, fileUrl, parseUser.userId.objectId);
} else {
const filename = sanitizeFileName(`${name}.pdf`);
if (parseExtUser?.TenantId?.ActiveFileAdapter) {
const adapter = {
fileAdapter: parseExtUser?.TenantId?.ActiveFileAdapter,
bucketName: parseExtUser?.TenantId?.FileAdapter?.bucketName,
region: parseExtUser?.TenantId?.FileAdapter?.region,
endpoint: parseExtUser?.TenantId?.FileAdapter?.endpoint,
accessKeyId: parseExtUser?.TenantId?.FileAdapter?.accessKeyId,
secretAccessKey: parseExtUser?.TenantId?.FileAdapter?.secretAccessKey,
baseUrl: parseExtUser?.TenantId?.FileAdapter?.baseUrl,
};
let adapter = {};
const ActiveFileAdapter = parseExtUser?.TenantId?.ActiveFileAdapter || '';
if (ActiveFileAdapter) {
adapter =
parseExtUser?.TenantId?.FileAdapters?.find(x => (x.id = ActiveFileAdapter)) || {};
}
if (adapter?.id) {
const filedata = Buffer.from(base64File, 'base64');
// `uploadFileToS3` is used to save document in user's file storage
fileUrl = await uploadFileToS3(filedata, filename, 'application/pdf', adapter);
@@ -180,9 +177,7 @@ export default async function createDocumentwithCoordinate(request, response) {
object.set('IsTourEnabled', isTourEnabled);
object.set('IsSendMail', send_email);
if (parseExtUser?.TenantId?.ActiveFileAdapter) {
object.set('IsFileAdapter', true);
} else {
object.set('IsFileAdapter', false);
object.set('FileAdapterId', parseExtUser?.TenantId?.ActiveFileAdapter);
}
let contact = [];
if (signers && signers.length > 0) {
@@ -59,16 +59,13 @@ export default async function createTemplatewithCoordinate(request, response) {
saveFileUsage(buffer.length, fileUrl, parseUser.userId.objectId);
} else {
const filename = sanitizeFileName(`${name}.pdf`);
if (parseExtUser?.TenantId?.ActiveFileAdapter) {
const adapter = {
fileAdapter: parseExtUser?.TenantId?.ActiveFileAdapter,
bucketName: parseExtUser?.TenantId?.FileAdapter?.bucketName,
region: parseExtUser?.TenantId?.FileAdapter?.region,
endpoint: parseExtUser?.TenantId?.FileAdapter?.endpoint,
accessKeyId: parseExtUser?.TenantId?.FileAdapter?.accessKeyId,
secretAccessKey: parseExtUser?.TenantId?.FileAdapter?.secretAccessKey,
baseUrl: parseExtUser?.TenantId?.FileAdapter?.baseUrl,
};
let adapter = {};
const ActiveFileAdapter = parseExtUser?.TenantId?.ActiveFileAdapter || '';
if (ActiveFileAdapter) {
adapter =
parseExtUser?.TenantId?.FileAdapters?.find(x => (x.id = ActiveFileAdapter)) || {};
}
if (adapter?.id) {
const filedata = Buffer.from(base64File, 'base64');
// `uploadFileToS3` is used to save document in user's file storage
fileUrl = await uploadFileToS3(filedata, filename, 'application/pdf', adapter);
@@ -205,9 +202,7 @@ export default async function createTemplatewithCoordinate(request, response) {
});
}
if (parseExtUser?.TenantId?.ActiveFileAdapter) {
object.set('IsFileAdapter', true);
} else {
object.set('IsFileAdapter', false);
object.set('FileAdapterId', parseExtUser?.TenantId?.ActiveFileAdapter);
}
const newACL = new Parse.ACL();
newACL.setPublicReadAccess(false);
@@ -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'));
@@ -5,7 +5,7 @@
exports.up = async Parse => {
const className = 'contracts_Document';
const schema = new Parse.Schema(className);
schema.addBoolean('IsFileAdapter');
schema.addBoolean('FileAdapterId');
return schema.update();
};
@@ -16,6 +16,6 @@ exports.up = async Parse => {
exports.down = async Parse => {
const className = 'contracts_Document';
const schema = new Parse.Schema(className);
schema.deleteField('IsFileAdapter');
schema.deleteField('FileAdapterId');
return schema.update();
};