diff --git a/server/models/pages.js b/server/models/pages.js index abe2bc6e..cd786374 100644 --- a/server/models/pages.js +++ b/server/models/pages.js @@ -650,7 +650,15 @@ module.exports = class Page extends Model { * @returns {Promise} Promise with no value */ static async movePage(opts) { - const page = await WIKI.models.pages.query().findById(opts.id) + let page + if (_.has(opts, 'id')) { + page = await WIKI.models.pages.query().findById(opts.id) + } else { + page = await WIKI.models.pages.query().findOne({ + path: opts.path, + localeCode: opts.locale + }) + } if (!page) { throw new WIKI.Error.PageNotFound() } @@ -704,9 +712,11 @@ module.exports = class Page extends Model { const destinationHash = pageHelper.generateHash({ path: opts.destinationPath, locale: opts.destinationLocale, privateNS: opts.isPrivate ? 'TODO' : '' }) // -> Move page + const destinationTitle = (page.title === page.path ? opts.destinationPath : page.title) await WIKI.models.pages.query().patch({ path: opts.destinationPath, localeCode: opts.destinationLocale, + title: destinationTitle, hash: destinationHash }).findById(page.id) await WIKI.models.pages.deletePageFromCache(page.hash) @@ -775,7 +785,7 @@ module.exports = class Page extends Model { }) } if (!page) { - throw new Error('Invalid Page Id') + throw new WIKI.Error.PageNotFound() } // -> Check for page access diff --git a/server/modules/storage/git/storage.js b/server/modules/storage/git/storage.js index c023c7e8..aff0c0d3 100644 --- a/server/modules/storage/git/storage.js +++ b/server/modules/storage/git/storage.js @@ -142,7 +142,9 @@ module.exports = { if (_.get(diff, 'files', []).length > 0) { let filesToProcess = [] for (const f of diff.files) { - const fPath = path.join(this.repoPath, f.file) + const fMoved = f.file.split(' => ') + const fName = fMoved.length === 2 ? fMoved[1] : fMoved[0] + const fPath = path.join(this.repoPath, fName) let fStats = { size: 0 } try { fStats = await fs.stat(fPath) @@ -159,7 +161,8 @@ module.exports = { path: fPath, stats: fStats }, - relPath: f.file + oldPath: fMoved[0], + relPath: fName }) } await this.processFiles(filesToProcess, rootUser) @@ -174,11 +177,25 @@ module.exports = { async processFiles(files, user) { for (const item of files) { const contentType = pageHelper.getContentType(item.relPath) - const fileExists = await fs.pathExists(item.file) + const fileExists = await fs.pathExists(item.file.path) if (!item.binary && contentType) { // -> Page - if (!fileExists && item.deletions > 0 && item.insertions === 0) { + if (fileExists && item.relPath !== item.oldPath) { + // Page was renamed by git, so rename in DB + WIKI.logger.info(`(STORAGE/GIT) Page marked as renamed: from ${item.oldPath} to ${item.relPath}`) + + const contentPath = pageHelper.getPagePath(item.oldPath) + const contentDestinationPath = pageHelper.getPagePath(item.relPath) + await WIKI.models.pages.movePage({ + user: user, + path: contentPath.path, + destinationPath: contentDestinationPath.path, + locale: contentPath.locale, + destinationLocale: contentPath.locale, + skipStorage: true + }) + } else if (!fileExists && item.deletions > 0 && item.insertions === 0) { // Page was deleted by git, can safely mark as deleted in DB WIKI.logger.info(`(STORAGE/GIT) Page marked as deleted: ${item.relPath}`) @@ -207,7 +224,23 @@ module.exports = { } else { // -> Asset - if (!fileExists && ((item.before > 0 && item.after === 0) || (item.deletions > 0 && item.insertions === 0))) { + if (fileExists && ((item.before === item.after) || (item.deletions === 0 && item.insertions === 0))) { + // Asset was renamed by git, so rename in DB + WIKI.logger.info(`(STORAGE/GIT) Asset marked as renamed: from ${item.oldPath} to ${item.relPath}`) + + const fileHash = assetHelper.generateHash(item.relPath) + const assetToRename = await WIKI.models.assets.query().findOne({ hash: fileHash }) + if (assetToRename) { + await WIKI.models.assets.query().patch({ + filename: item.relPath, + hash: fileHash + }).findById(assetToRename.id) + await assetToRename.deleteAssetCache() + } else { + WIKI.logger.info(`(STORAGE/GIT) Asset was not found in the DB, nothing to rename: ${item.relPath}`) + } + continue + } else if (!fileExists && ((item.before > 0 && item.after === 0) || (item.deletions > 0 && item.insertions === 0))) { // Asset was deleted by git, can safely mark as deleted in DB WIKI.logger.info(`(STORAGE/GIT) Asset marked as deleted: ${item.relPath}`) @@ -419,7 +452,7 @@ module.exports = { transform: async (page, enc, cb) => { const pageObject = await WIKI.models.pages.query().findById(page.id) page.tags = await pageObject.$relatedQuery('tags') - + let fileName = `${page.path}.${pageHelper.getFileExtension(page.contentType)}` if (WIKI.config.lang.namespacing && WIKI.config.lang.code !== page.localeCode) { fileName = `${page.localeCode}/${fileName}`