import axios from 'axios'; import { cloudServerUrl } from '../../Utils.js'; const serverUrl = cloudServerUrl; //process.env.SERVER_URL; const appId = process.env.APP_ID; async function deductcount(tenantId, docs, extUserId) { try { const subscription = new Parse.Query('contracts_Subscriptions'); subscription.equalTo('TenantId', { __type: 'Pointer', className: 'partners_Tenant', objectId: tenantId, }); subscription.include('ExtUserPtr'); subscription.greaterThan('AllowedQuicksend', 0); const resSub = await subscription.first({ useMasterKey: true }); if (resSub) { const updateApiCount = resSub?.get('AllowedQuicksend') && resSub.get('AllowedQuicksend') > 0 ? resSub.get('AllowedQuicksend') - docs : 0; const subscriptionCls = new Parse.Object('contracts_Subscriptions'); subscriptionCls.id = resSub.id; if (updateApiCount > 0) { subscriptionCls.set('AllowedQuicksend', updateApiCount); } else { subscriptionCls.set('AllowedQuicksend', 0); } const resSubcription = await subscriptionCls.save(null, { useMasterKey: true }); } const extCls = new Parse.Object('contracts_Users'); extCls.id = extUserId; extCls.increment('DocumentCount', docs); const resExt = await extCls.save(null, { useMasterKey: true }); } catch (err) { console.log('Err in deduct in quick send', err); } } async function sendMail(document, sessionToken) { const baseUrl = new URL(process.env.PUBLIC_URL); // console.log("pdfDetails", pdfDetails); const timeToCompleteDays = document?.TimeToCompleteDays || 15; const ExpireDate = new Date(document.createdAt); ExpireDate.setDate(ExpireDate.getDate() + timeToCompleteDays); const newDate = ExpireDate; const localExpireDate = newDate.toLocaleDateString('en-US', { day: 'numeric', month: 'long', year: 'numeric', }); const sender = document.ExtUserPtr.Email; let signerMail = document.Placeholders; if (document.SendinOrder) { signerMail = signerMail.slice(); signerMail.splice(1); } for (let i = 0; i < signerMail.length; i++) { try { const imgPng = 'https://qikinnovation.ams3.digitaloceanspaces.com/logo.png'; let url = `${serverUrl}/functions/sendmailv3`; const headers = { 'Content-Type': 'application/json', 'X-Parse-Application-Id': appId, sessionToken: sessionToken, }; const objectId = signerMail[i]?.signerObjId; const hostUrl = baseUrl.origin; let encodeBase64; let existSigner = {}; if (objectId) { existSigner = document?.Signers?.find(user => user.objectId === objectId); encodeBase64 = btoa(`${document.objectId}/${existSigner?.Email}/${objectId}`); } else { encodeBase64 = btoa(`${document.objectId}/${signerMail[i].email}`); } let signPdf = `${hostUrl}/login/${encodeBase64}`; const openSignUrl = 'https://www.opensignlabs.com/'; const orgName = document.ExtUserPtr.Company ? document.ExtUserPtr.Company : ''; const themeBGcolor = '#47a3ad'; let params = { extUserId: document.ExtUserPtr.objectId, recipient: objectId ? existSigner?.Email : signerMail[i].email, subject: `${document.ExtUserPtr.Name} has requested you to sign "${document.Name}"`, mailProvider: document?.ExtUserPtr?.active_mail_adapter || '', from: sender, html: "

Digital Signature Request

" + document.ExtUserPtr.Name + ' has requested you to review and sign ' + document.Name + ".

Sender " + sender + "
Organization " + orgName + "
Expires on " + localExpireDate + "

This is an automated email from OpenSign™. For any queries regarding this email, please contact the sender " + sender + ' directly.If you think this email is inappropriate or spam, you may file a complaint with OpenSign™ here.

', }; const sendMail = await axios.post(url, params, { headers: headers }); // if (sendMail.data.result.status === 'success') { // console.log('batch login mail sent'); // } } catch (error) { console.log('error', error); } } } export default async function createBatchDocs(request) { const strDocuments = request.params.Documents; const sessionToken = request.headers['sessiontoken']; const Documents = JSON.parse(strDocuments); const Ip = request?.headers?.['x-real-ip'] || ''; const parseConfig = { baseURL: serverUrl, //localStorage.getItem('baseUrl'), headers: { 'X-Parse-Application-Id': appId, 'X-Parse-Session-Token': sessionToken, 'Content-Type': 'application/json', }, }; try { const user = await axios.get(serverUrl + '/users/me', { headers: { 'X-Parse-Application-Id': appId, 'X-Parse-Session-Token': request.headers['sessiontoken'], }, }); if (user.data) { const extCls = new Parse.Query('contracts_Users'); extCls.equalTo('UserId', { __type: 'Pointer', className: '_User', objectId: user.data.objectId, }); const resExt = await extCls.first({ useMasterKey: true }); if (resExt) { const _resExt = JSON.parse(JSON.stringify(resExt)); try { const requests = Documents.map(x => { const Signers = x.Signers; const allSigner = x?.Placeholders?.map( item => Signers?.find(e => item?.signerPtr?.objectId === e?.objectId) || item?.signerPtr ).filter(signer => Object.keys(signer).length > 0); const date = new Date(); const isoDate = date.toISOString(); let Acl = { [x.CreatedBy.objectId]: { read: true, write: true } }; if (allSigner && allSigner.length > 0) { allSigner.forEach(x => { const obj = { [x.CreatedBy.objectId]: { read: true, write: true } }; Acl = { ...Acl, ...obj }; }); } return { method: 'POST', path: '/app/classes/contracts_Document', body: { Name: x.Name, URL: x.URL, Note: x.Note, Description: x.Description, CreatedBy: x.CreatedBy, SendinOrder: x.SendinOrder || true, ExtUserPtr: { __type: 'Pointer', className: x.ExtUserPtr.className, objectId: x.ExtUserPtr.objectId, }, Placeholders: x.Placeholders.map(y => y?.signerPtr?.objectId ? { ...y, signerPtr: { __type: 'Pointer', className: 'contracts_Contactbook', objectId: y.signerPtr.objectId, }, signerObjId: y.signerObjId, } : { ...y, signerPtr: {}, signerObjId: '' } ), SignedUrl: x.URL || x.SignedUrl, SentToOthers: true, Signers: allSigner?.map(y => ({ __type: 'Pointer', className: 'contracts_Contactbook', objectId: y.objectId, })), ACL: Acl, SentToOthers: true, RemindOnceInEvery: x.RemindOnceInEvery || 5, AutomaticReminders: x.AutomaticReminders || false, TimeToCompleteDays: x.TimeToCompleteDays || 15, OriginIp: Ip, DocSentAt: { __type: 'Date', iso: isoDate }, }, }; }); // console.log('requests ', requests); const response = await axios.post('batch', { requests: requests }, parseConfig); // // Handle the batch query response // console.log('Batch query response:', response.data); if (response.data && response.data.length > 0) { const updateDocuments = Documents.map((x, i) => ({ ...x, objectId: response.data[i]?.success?.objectId, createdAt: response.data[i]?.success?.createdAt, })); deductcount(_resExt.TenantId.objectId, response.data.length, resExt.id); for (let i = 0; i < updateDocuments.length; i++) { sendMail(updateDocuments[i], sessionToken); } return 'success'; } // Handle individual responses within response.data.results } catch (error) { const code = err?.response?.data?.code || err?.response?.status || err?.code || 400; const msg = err?.response?.data?.error || err?.response?.data || err?.message || 'Something went wrong.'; console.log('Error performing batch query:', code, msg); throw new Parse.Error(code, msg); } } } else { new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'User not found.'); } } catch (err) { console.log('err in createbatchdoc', err); const code = err?.code || 400; const msg = err?.message || 'Something went wrong.'; new Parse.Error(code, msg); } }