Refactored Custom Form Table Structure
This commit is contained in:
parent
477aff95d5
commit
c3ee53bd4b
3 changed files with 178 additions and 84 deletions
|
@ -42,8 +42,7 @@ module.exports.list = (listId, callback) => {
|
|||
return callback(err);
|
||||
}
|
||||
|
||||
let query = 'SELECT * FROM custom_forms WHERE list=? ORDER BY id';
|
||||
connection.query(query, [listId], (err, rows) => {
|
||||
connection.query('SELECT * FROM custom_forms WHERE list=? ORDER BY id', [listId], (err, rows) => {
|
||||
connection.release();
|
||||
if (err) {
|
||||
return callback(err);
|
||||
|
@ -67,15 +66,32 @@ module.exports.get = (id, callback) => {
|
|||
return callback(err);
|
||||
}
|
||||
|
||||
let query = 'SELECT * FROM custom_forms WHERE id=? LIMIT 1';
|
||||
connection.query(query, [id], (err, rows) => {
|
||||
connection.release();
|
||||
connection.query('SELECT * FROM custom_forms WHERE id=? LIMIT 1', [id], (err, rows) => {
|
||||
if (err) {
|
||||
connection.release();
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
let form = rows && rows[0] && tools.convertKeys(rows[0]) || false;
|
||||
return callback(null, form);
|
||||
|
||||
if (!form) {
|
||||
connection.release();
|
||||
return callback(new Error('Selected form not found'));
|
||||
}
|
||||
|
||||
connection.query('SELECT * FROM custom_forms_data WHERE form=?', [id], (err, data_rows = []) => {
|
||||
connection.release();
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
data_rows.forEach(data_row => {
|
||||
let modelKey = tools.fromDbKey(data_row.data_key);
|
||||
form[modelKey] = data_row.data_value;
|
||||
});
|
||||
|
||||
return callback(null, form);
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
@ -116,15 +132,66 @@ module.exports.create = (listId, form, callback) => {
|
|||
return callback(err);
|
||||
}
|
||||
|
||||
let query = 'INSERT INTO custom_forms (' + keys.join(', ') + ') VALUES (' + values.map(() => '?').join(',') + ')';
|
||||
connection.query(query, values, (err, result) => {
|
||||
let filtered = filterKeysAndValues(keys, values, 'exclude', ['mail_', 'web_']);
|
||||
let query = 'INSERT INTO custom_forms (' + filtered.keys.join(', ') + ') VALUES (' + filtered.values.map(() => '?').join(',') + ')';
|
||||
|
||||
connection.query(query, filtered.values, (err, result) => {
|
||||
connection.release();
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
let formId = result && result.insertId || false;
|
||||
return callback(null, formId);
|
||||
let formId = result && result.insertId;
|
||||
|
||||
if (!formId) {
|
||||
return callback(new Error('Invalid custom_forms insertId'));
|
||||
}
|
||||
|
||||
let jobs = 1;
|
||||
let error = null;
|
||||
|
||||
let done = err => {
|
||||
jobs--;
|
||||
error = err ? err : error; // One's enough
|
||||
jobs === 0 && callback(error, formId)
|
||||
};
|
||||
|
||||
filtered = filterKeysAndValues(keys, values, 'include', ['mail_', 'web_']);
|
||||
|
||||
filtered.keys.forEach((key, index) => {
|
||||
jobs++;
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
if (err) {
|
||||
return done(err);
|
||||
}
|
||||
|
||||
connection.query('INSERT INTO custom_forms_data (form, data_key, data_value) VALUES (?, ?, ?)', [formId, key, filtered.values[index]], (err, result) => {
|
||||
if (err) {
|
||||
connection.release();
|
||||
return done(err);
|
||||
}
|
||||
|
||||
let dataId = result && result.insertId;
|
||||
|
||||
if (!dataId) {
|
||||
connection.release();
|
||||
return done(new Error('Invalid custom_forms_data insertId'));
|
||||
}
|
||||
|
||||
connection.query('UPDATE custom_forms SET `' + key + '`=? WHERE id=?', [dataId, formId], (err, result) => {
|
||||
connection.release();
|
||||
if (err) {
|
||||
return done(err);
|
||||
}
|
||||
|
||||
return done(null);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
done(null);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
@ -163,21 +230,61 @@ module.exports.update = (id, updates, callback) => {
|
|||
return callback(err);
|
||||
}
|
||||
|
||||
values.push(id);
|
||||
let filtered = filterKeysAndValues(keys, values, 'exclude', ['mail_', 'web_']);
|
||||
let query = 'UPDATE custom_forms SET ' + filtered.keys.map(key => '`' + key + '`=?').join(', ') + ' WHERE id=? LIMIT 1';
|
||||
|
||||
connection.query('UPDATE custom_forms SET ' + keys.map(key => '`' + key + '`=?').join(', ') + ' WHERE id=? LIMIT 1', values, (err, result) => {
|
||||
connection.query(query, filtered.values.concat(id), (err, result) => {
|
||||
connection.release();
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
// Save then validate, as otherwise their work get's lost ...
|
||||
err = testForMjmlErrors(keys, values);
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
let affectedRows = result && result.affectedRows;
|
||||
|
||||
return callback(null, result && result.affectedRows || false);
|
||||
let jobs = 1;
|
||||
let error = null;
|
||||
|
||||
let done = err => {
|
||||
jobs--;
|
||||
error = err ? err : error; // One's enough
|
||||
|
||||
if (jobs === 0) {
|
||||
if (error) {
|
||||
return callback(error);
|
||||
}
|
||||
|
||||
// Save then validate, as otherwise their work get's lost ...
|
||||
err = testForMjmlErrors(keys, values);
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
return callback(null, affectedRows);
|
||||
}
|
||||
};
|
||||
|
||||
filtered = filterKeysAndValues(keys, values, 'include', ['mail_', 'web_']);
|
||||
|
||||
filtered.keys.forEach((key, index) => {
|
||||
jobs++;
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
if (err) {
|
||||
return done(err);
|
||||
}
|
||||
|
||||
connection.query('UPDATE custom_forms_data SET data_value=? WHERE data_key=? AND form=?', [filtered.values[index], key, id], (err, result) => {
|
||||
connection.release();
|
||||
if (err) {
|
||||
return done(err);
|
||||
}
|
||||
|
||||
return done(null);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
done(null);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
@ -194,8 +301,7 @@ module.exports.delete = (formId, callback) => {
|
|||
return callback(err);
|
||||
}
|
||||
|
||||
let query = 'SELECT * FROM custom_forms WHERE id=? LIMIT 1';
|
||||
connection.query(query, [formId], (err, rows) => {
|
||||
connection.query('SELECT * FROM custom_forms WHERE id=? LIMIT 1', [formId], (err, rows) => {
|
||||
if (err) {
|
||||
connection.release();
|
||||
return callback(err);
|
||||
|
@ -243,6 +349,26 @@ function setDefaultValues(form) {
|
|||
return form;
|
||||
}
|
||||
|
||||
function filterKeysAndValues(keysIn, valuesIn, method = 'include', prefixes = []) {
|
||||
let values = [];
|
||||
|
||||
let prefixMatch = key => (
|
||||
prefixes.some(prefix => key.startsWith(prefix))
|
||||
);
|
||||
|
||||
let keys = keysIn.filter((key, index) => {
|
||||
if ((method === 'include' && prefixMatch(key)) || (method === 'exclude' && !prefixMatch(key))) {
|
||||
values.push(valuesIn[index]);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
return {
|
||||
keys,
|
||||
values
|
||||
};
|
||||
}
|
||||
|
||||
function testForMjmlErrors(keys, values) {
|
||||
let testLayout = '<mjml><mj-body><mj-container>{{{body}}}</mj-container></mj-body></mjml>';
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue