Merge pull request #937 from nxglabs/tenant_mailtemplate

fix: if user not provide default value use it from template in createdocument from template API
This commit is contained in:
nxglabs
2025-07-03 16:04:35 +00:00
parent 4a5b35e147
commit 71b9bd6367
45 changed files with 2147 additions and 1067 deletions
+2
View File
@@ -289,6 +289,8 @@ export const selectFormat = data => {
return 'MMMM dd, yyyy';
case 'DD MMMM, YYYY':
return 'dd MMMM, yyyy';
case 'DD.MM.YYYY':
return 'dd.MM.yyyy';
default:
return 'MM/dd/yyyy';
}
@@ -92,7 +92,7 @@ async function AuthLoginAsMail(request) {
} catch (err) {
console.log('err in Auth');
console.log(err);
return 'Result not found', err;
return 'Result not found';
}
}
export default AuthLoginAsMail;
@@ -84,7 +84,7 @@ async function sendMail(document, publicUrl) {
};
let params = {
extUserId: document.ExtUserPtr.objectId,
recipient: objectId ? existSigner?.Email : signerMail[i].email,
recipient: existSigner?.Email || signerMail[i].email,
subject: replaceVar?.subject ? replaceVar?.subject : mailTemplate(mailparam).subject,
from: document.ExtUserPtr.Email,
replyto: senderEmail || '',
@@ -1,25 +1,5 @@
// `saveRoleContact` is used to save user in contracts_Guest role and create contact
const saveRoleContact = async contact => {
try {
const Role = new Parse.Query(Parse.Role);
const guestRole = await Role.equalTo('name', 'contracts_Guest').first();
if (guestRole) {
// Check if the user is already in the role
const relation = guestRole.relation('users');
const usersInRoleQuery = relation.query();
usersInRoleQuery.equalTo('objectId', contact.UserId.objectId);
const usersInRole = await usersInRoleQuery.find();
if (usersInRole.length > 0) {
console.log('User already added to Guest role.');
} else {
relation.add({ __type: 'Pointer', className: '_User', id: contact.UserId.objectId });
await guestRole.save(null, { useMasterKey: true });
// console.log('User added to Guest role successfully.');
}
}
} catch (err) {
console.log('err in role save', err);
}
const contactQuery = new Parse.Object('contracts_Contactbook');
contactQuery.set('Name', contact.Name);
contactQuery.set('Email', contact.Email);
@@ -59,6 +59,7 @@ export default async function saveAsTemplate(request) {
options: {
...p.options,
status: 'required',
...(p?.options?.defaultValue ? { defaultValue: '' } : {}),
},
})),
}));
@@ -73,10 +74,28 @@ export default async function saveAsTemplate(request) {
};
templateCls.set('Placeholders', [placeHolders]);
} else {
const placeHolders = _docRes?.Placeholders?.map((x, i) => {
const email = x.email ? { email: '' } : {};
return { ...x, signerObjId: '', signerPtr: {}, Role: 'Role ' + (i + 1), ...email };
});
const placeHolders = _docRes?.Placeholders.map((signer, signerIndex) => ({
// copy everything else, then overwrite these fields:
...signer,
signerObjId: '',
signerPtr: {},
Role: `Role ${signerIndex + 1}`,
email: '',
// rebuild placeHolder/pages
placeHolder: (signer.placeHolder || []).map(page => ({
...page,
pos: (page.pos || []).map(widget => {
// if there is a defaultValue in options, zero it out
if (widget.options && widget.options.defaultValue !== undefined) {
return { ...widget, options: { ...widget.options, defaultValue: '' } }; // reset only the value
}
// otherwise, return the widget unchanged
return widget;
}),
})),
}));
templateCls.set('Placeholders', placeHolders);
}
}
@@ -38,7 +38,6 @@ const makeEmail = async (
replyto,
testPdf
) => {
const publicUrl = new URL(process.env.SERVER_URL);
const htmlContent = html;
const boundary = 'boundary_' + Date.now().toString(16);
const bccHeader = bcc && bcc.length > 0 ? `BCC: ${bcc.join(',')}\n` : ''; // Construct BCC header if provided
@@ -8,12 +8,15 @@ export default async function updateTenant(request) {
if (!request.user) {
throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'unauthorized');
}
const validKeys = ['CompletionBody', 'CompletionSubject', 'RequestBody', 'RequestSubject'];
try {
const tenant = new Parse.Object('partners_Tenant');
tenant.id = tenantId;
// Update tenant details
Object.keys(details).forEach(key => {
tenant.set(key, details?.[key]);
if (validKeys.includes(key)) {
tenant.set(key, details?.[key]);
}
});
const tenantRes = await tenant.save(null, { useMasterKey: true });
@@ -0,0 +1,19 @@
/**
*
* @param {Parse} Parse
*/
exports.up = async Parse => {
const schema = new Parse.Schema('contracts_Subscriptions');
schema.addNumber('CreditAlertLevel');
return schema.update();
};
/**
*
* @param {Parse} Parse
*/
exports.down = async Parse => {
const schema = new Parse.Schema('contracts_Subscriptions');
schema.deleteField('CreditAlertLevel');
return schema.update();
};
-1
View File
@@ -232,7 +232,6 @@ if (!process.env.TESTING) {
const isWindows = process.platform === 'win32';
// console.log('isWindows', isWindows);
createContactIndex();
const migrate = isWindows
? `set APPLICATION_ID=${serverAppId}&& set SERVER_URL=${cloudServerUrl}&& set MASTER_KEY=${process.env.MASTER_KEY}&& npx parse-dbtool migrate`
: `APPLICATION_ID=${serverAppId} SERVER_URL=${cloudServerUrl} MASTER_KEY=${process.env.MASTER_KEY} npx parse-dbtool migrate`;
+962 -386
View File
File diff suppressed because it is too large Load Diff
+9 -9
View File
@@ -18,8 +18,8 @@
"watch": "nodemon index.js"
},
"dependencies": {
"@aws-sdk/client-s3": "^3.828.0",
"@aws-sdk/s3-request-presigner": "^3.828.0",
"@aws-sdk/client-s3": "^3.840.0",
"@aws-sdk/s3-request-presigner": "^3.840.0",
"@parse/fs-files-adapter": "^3.0.0",
"@parse/s3-files-adapter": "^4.2.0",
"@pdf-lib/fontkit": "^1.1.1",
@@ -31,38 +31,38 @@
"coherentpdf": "^2.5.5",
"cors": "^2.8.5",
"date-fns-tz": "^3.2.0",
"dotenv": "^16.5.0",
"dotenv": "^16.6.1",
"express": "^5.1.0",
"form-data": "^4.0.3",
"generate-api-key": "^1.0.2",
"googleapis": "^150.0.1",
"libreoffice-convert": "^1.6.1",
"mailgun.js": "^12.0.2",
"mailgun.js": "^12.0.3",
"mongodb": "^6.17.0",
"multer": "^2.0.1",
"multer-s3": "^3.0.1",
"node-forge": "^1.3.1",
"nodemailer": "^7.0.3",
"nodemailer": "^7.0.4",
"parse": "^6.1.1",
"parse-dbtool": "^1.2.0",
"parse-server": "^8.2.1",
"parse-server-api-mail-adapter": "^4.1.0",
"pdf-lib": "^1.17.1",
"posthog-node": "^5.1.0",
"posthog-node": "^5.1.1",
"qrcode": "^1.5.4",
"rate-limiter-flexible": "^7.1.1",
"speakeasy": "^2.0.0",
"ws": "^8.18.2"
"ws": "^8.18.3"
},
"type": "module",
"devDependencies": {
"@babel/eslint-parser": "^7.27.5",
"eslint": "^9.29.0",
"jasmine": "^5.8.0",
"mongodb-runner": "^5.9.0",
"mongodb-runner": "^5.9.2",
"nodemon": "^3.1.10",
"nyc": "^17.1.0",
"prettier": "^3.5.3"
"prettier": "^3.6.2"
},
"overrides": {
"ws": "$ws",