mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-20 17:32:15 +03:00
426cbeec0f
closes https://github.com/TryGhost/Ghost/issues/12791 closes https://github.com/TryGhost/Team/issues/566 https://github.com/TryGhost/Ghost/pull/12787 introduced a significant performance regression due to a misunderstanding of when Bookshelf calls `.format()` ([related upstream issue](https://github.com/bookshelf/bookshelf/issues/668)). We expected `.format()` to only be called on save but it's also called when Bookshelf performs fetching and eager loading which happens frequently. `.format()` can be a heavy method as it needs to parse and serialize html and markdown so it should be performed as infrequently as possible. - override `sync()` in the base model so we can call our own `.formatOnWrite()` method to transform attributes on `update` and `insert` operations - this was the only feasible location in Bookshelf I could find that is low enough level to not require modifying model instance attributes - gives models the option to perform heavy transform operations only when writing to the database compared to the usual `.format()` method that is also called on fetch in many situations
34 lines
821 B
JavaScript
34 lines
821 B
JavaScript
const ghostBookshelf = require('./base');
|
|
const urlUtils = require('../../shared/url-utils');
|
|
|
|
const Snippet = ghostBookshelf.Model.extend({
|
|
tableName: 'snippets',
|
|
|
|
formatOnWrite(attrs) {
|
|
if (attrs.mobiledoc) {
|
|
attrs.mobiledoc = urlUtils.mobiledocToTransformReady(attrs.mobiledoc);
|
|
}
|
|
|
|
return attrs;
|
|
},
|
|
|
|
parse() {
|
|
const attrs = ghostBookshelf.Model.prototype.parse.apply(this, arguments);
|
|
|
|
if (attrs.mobiledoc) {
|
|
attrs.mobiledoc = urlUtils.transformReadyToAbsolute(attrs.mobiledoc);
|
|
}
|
|
|
|
return attrs;
|
|
}
|
|
});
|
|
|
|
const Snippets = ghostBookshelf.Collection.extend({
|
|
model: Snippet
|
|
});
|
|
|
|
module.exports = {
|
|
Snippet: ghostBookshelf.model('Snippet', Snippet),
|
|
Snippets: ghostBookshelf.collection('Snippets', Snippets)
|
|
};
|