diff --git a/apps/OpenSign/src/routes/GenerateToken.js b/apps/OpenSign/src/routes/GenerateToken.js index 1adc0f3e74..d112f15c3e 100644 --- a/apps/OpenSign/src/routes/GenerateToken.js +++ b/apps/OpenSign/src/routes/GenerateToken.js @@ -90,7 +90,7 @@ function GenerateToken() { const handleModal = () => setIsModal(!isModal); return ( - + <Title title={"API Token"} /> {isGenerate && ( <Alert type="success">Token generated successfully!</Alert> )} @@ -115,9 +115,10 @@ function GenerateToken() { </div> ) : ( <div className="bg-white flex flex-col justify-center shadow rounded"> - <ul className="w-full flex flex-col p-2 text-sm"> + <h1 className="ml-4 mt-3 mb-2 font-semibold">API Token</h1> + <ul className="w-full flex flex-col p-2 text-sm"> <li - className={`flex justify-between items-center border-t-[1px] border-gray-300 break-all py-2`} + className={`flex justify-between items-center border-y-[1px] border-gray-300 break-all py-2`} > <span className="w-[40%]">Api Token:</span>{" "} <span @@ -128,17 +129,6 @@ function GenerateToken() { {apiToken && apiToken} </span> </li> - <li - className={`flex justify-between items-center border-y-[1px] border-gray-300 break-all py-2`} - > - <span className="w-[40%]">Application Id:</span>{" "} - <span - className="w-[60%] md:text-end cursor-pointer" - onClick={() => copytoclipboard(localStorage.getItem("AppID12"))} - > - {localStorage.getItem("AppID12")} - </span> - </li> </ul> <div className="flex flex-col md:flex-row items-center justify-center gap-2 pb-4"> <button @@ -150,7 +140,11 @@ function GenerateToken() { </button> <button type="button" - onClick={() => openInNewTab("https://docs.opensignlabs.com")} + onClick={() => + openInNewTab( + "https://docs.opensignlabs.com/docs/API-docs/opensign-api-v-1" + ) + } className="rounded hover:bg-[#15b4e9] border-[1px] border-[#15b4e9] text-[#15b4e9] hover:text-white px-11 py-2 text-xs md:text-base focus:outline-none" > View Docs diff --git a/apps/OpenSign/src/routes/Webhook.js b/apps/OpenSign/src/routes/Webhook.js index 2c1424ec5a..eaaf5b2263 100644 --- a/apps/OpenSign/src/routes/Webhook.js +++ b/apps/OpenSign/src/routes/Webhook.js @@ -12,7 +12,6 @@ function Webhook() { const [parseAppId] = useState(localStorage.getItem("parseAppId")); const [webhook, setWebhook] = useState(); const [isLoader, setIsLoader] = useState(true); - const [copied, setCopied] = useState(false); const [isGenerate, setIsGenerate] = useState(false); const [isErr, setIsErr] = useState(false); const [isModal, setIsModal] = useState(false); @@ -77,19 +76,11 @@ function Webhook() { } }; - const copytoclipboard = (text) => { - navigator.clipboard.writeText(text); - setCopied(true); - setTimeout(() => { - setCopied(false); - }, 1500); // Reset copied state after 1.5 seconds - }; const handleModal = () => setIsModal(!isModal); return ( <React.Fragment> <Title title={"Webhook"} /> {isGenerate && <Alert type="success">Webhook added successfully!</Alert>} - {copied && <Alert type="success">Copied</Alert>} {isErr && <Alert type="danger">Something went wrong!</Alert>} {isLoader ? ( <div @@ -110,26 +101,16 @@ function Webhook() { </div> ) : ( <div className="bg-white flex flex-col justify-center shadow rounded"> + <h1 className="ml-4 mt-3 mb-2 font-semibold">Webhook</h1> <ul className="w-full flex flex-col p-2 text-sm"> <li - className={`flex justify-between items-center border-t-[1px] border-gray-300 break-all py-2`} + className={`flex justify-between items-center border-y-[1px] border-gray-300 break-all py-2`} > <span className="w-[40%]">Webhook:</span>{" "} <span id="token" className="w-[60%] md:text-end cursor-pointer"> {webhook && webhook} </span> </li> - <li - className={`flex justify-between items-center border-y-[1px] border-gray-300 break-all py-2`} - > - <span className="w-[40%]">Application Id:</span>{" "} - <span - className="w-[60%] md:text-end cursor-pointer" - onClick={() => copytoclipboard(localStorage.getItem("AppID12"))} - > - {localStorage.getItem("AppID12")} - </span> - </li> </ul> <div className="flex flex-col md:flex-row items-center justify-center gap-2 pb-4"> <button @@ -141,7 +122,11 @@ function Webhook() { </button> <button type="button" - onClick={() => openInNewTab("https://docs.opensignlabs.com")} + onClick={() => + openInNewTab( + "https://docs.opensignlabs.com/docs/API-docs/opensign-api-v-1" + ) + } className="rounded hover:bg-[#15b4e9] border-[1px] border-[#15b4e9] text-[#15b4e9] hover:text-white px-11 py-2 text-xs md:text-base focus:outline-none" > View Docs diff --git a/apps/OpenSignServer/cloud/customRoute/v1/apiV1.js b/apps/OpenSignServer/cloud/customRoute/v1/apiV1.js index 6938d02f29..b4a5449b30 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/apiV1.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/apiV1.js @@ -70,7 +70,10 @@ app.delete('/document/:document_id', deleteDocument); app.get('/documentlist/:doctype', getDocumentList); // create Template -app.post('/createtemplate', upload.array('file', 1), createTemplate); +app.post('/createtemplate', createTemplate); + +// create Template with binary +app.post('/createtemplatewithbinary', upload.array('file', 1), createTemplate); // get template on the basis of id app.get('/template/:template_id', getTemplate); diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/createContact.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/createContact.js index 2079f059a0..59aa21aa21 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/createContact.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/createContact.js @@ -131,7 +131,7 @@ export default async function createContact(request, response) { } catch (err) { console.log('err ', err); if (err.code === 137) { - return response.status(137).json({ error: 'Contact already exists!' }); + return response.status(401).json({ error: 'Contact already exists!' }); } else { return response .status(400) diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocument.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocument.js index 0f2a1505d8..c346015207 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocument.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocument.js @@ -7,10 +7,10 @@ export default async function createDocument(request, response) { const description = request.body.Description; const signers = request.body.Signers; const folderId = request.body.FolderId; - const base64File = request.body.file; + const base64File = request.body.File; const url = request?.get('host'); const fileData = request.files?.[0] ? request.files[0].buffer : null; - console.log('fileData ', fileData); + // console.log('fileData ', fileData); try { const reqToken = request.headers['x-api-token']; if (!reqToken) { @@ -76,7 +76,7 @@ export default async function createDocument(request, response) { contactbook.notEqualTo('IsDeleted', true); contactbook.containedIn('Email', parseSigners); const contactbookRes = await contactbook.find({ useMasterKey: true }); - console.log('contactbookRes ', contactbookRes); + // console.log('contactbookRes ', contactbookRes); const parseContactbookRes = JSON.parse(JSON.stringify(contactbookRes)); // console.log('userPtr ', userPtr); // const newContacts = parseSigners diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplate.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplate.js index 83580707fb..ecd48381a1 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplate.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplate.js @@ -1,13 +1,13 @@ const randomId = () => Math.floor(1000 + Math.random() * 9000); export default async function createTemplate(request, response) { - const name = request.body.Title; - const note = request.body.Note; - const description = request.body.Description; - const signers = request.body.Signers; - const folderId = request.body.FolderId; - // const file = request.body.file; - const url = process.env.SERVER_URL; - const fileData = request.files[0] ? request.files[0].buffer : null; + const name = request.body?.Title; + const note = request.body?.Note; + const description = request.body?.Description; + const signers = request.body?.Signers; + const folderId = request.body?.FolderId; + const url = request?.get('host'); + const base64File = request.body.File; + const fileData = request.files?.[0] ? request.files[0].buffer : null; try { const reqToken = request.headers['x-api-token']; if (!reqToken) { @@ -19,13 +19,23 @@ export default async function createTemplate(request, response) { if (token !== undefined) { // Valid Token then proceed request 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(); + let fileUrl; + if (base64File) { + const file = new Parse.File(`${name}.pdf`, { + base64: base64File, + }); + await file.save({ useMasterKey: true }); + fileUrl = file.url(); + } else { + const file = new Parse.File(request.files?.[0]?.originalname, { + base64: fileData?.toString('base64'), + }); + await file.save({ useMasterKey: true }); + 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,17 +53,29 @@ export default async function createTemplate(request, response) { object.set('CreatedBy', userPtr); object.set('ExtUserPtr', extUserPtr); if (signers) { - const parseSigners = JSON.parse(signers); - const placeholders = parseSigners.map((x, i) => ({ - email: x, - Id: randomId(), - Role: 'User ' + (i + 1), - blockColor: '', - signerObjId: '', - signerPtr: {}, - placeHolder: [], - })); - object.set('Placeholders', placeholders); + let parseSigners; + if (base64File) { + parseSigners = signers; + } else { + parseSigners = JSON.parse(signers); + } + + const contactbook = new Parse.Query('contracts_Contactbook'); + contactbook.containedIn('Email', parseSigners); + contactbook.equalTo('UserId', userPtr); + contactbook.notEqualTo('IsDeleted', true); + const contactbookRes = await contactbook.find({ useMasterKey: true }); + // console.log('contactbookRes ', contactbookRes); + const parseContactbookRes = JSON.parse(JSON.stringify(contactbookRes)); + + object.set( + 'Signers', + parseContactbookRes?.map(x => ({ + __type: 'Pointer', + className: 'contracts_Contactbook', + objectId: x.objectId, + })) + ); } if (folderId) { object.set('Folder', folderPtr); @@ -65,7 +87,10 @@ export default async function createTemplate(request, response) { newACL.setWriteAccess(userPtr.id, true); object.setACL(newACL); const res = await object.save(null, { useMasterKey: true }); - return response.json({ objectId: res.id, url: url }); + return response.json({ + objectId: res.id, + url: 'https://' + url + '/load/signmicroapp/template/' + res.id, + }); } else { return response.status(405).json({ error: 'Invalid API Token!' }); } diff --git a/apps/OpenSignServer/cloud/parsefunction/TemplateAfterSave.js b/apps/OpenSignServer/cloud/parsefunction/TemplateAfterSave.js index d5bcc168a7..556cf1c392 100644 --- a/apps/OpenSignServer/cloud/parsefunction/TemplateAfterSave.js +++ b/apps/OpenSignServer/cloud/parsefunction/TemplateAfterSave.js @@ -13,7 +13,7 @@ export default async function TemplateAfterSave(request) { } } } else { - if (request.user) { + if (request?.user) { const signers = request.object.get('Signers'); if (signers && signers.length > 0) { await updateAclDoc(request.object.id); diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js index 49be44df99..ee778c2288 100644 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js +++ b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js @@ -112,7 +112,6 @@ async function sendDoctoWebhook(t) { .post(t?.data?.ExtUserPtr?.Webhook, e, { headers: { 'Content-Type': 'application/json' } }) .then(e => { try { - console.log('res ', e); var a = new Parse.Object('contracts_Webhook'); a.set('Log', e?.status), a.set('UserId', {