diff --git a/core/server/data/importer/importers/data/posts.js b/core/server/data/importer/importers/data/posts.js index a001abd7e0..3853a3b485 100644 --- a/core/server/data/importer/importers/data/posts.js +++ b/core/server/data/importer/importers/data/posts.js @@ -32,8 +32,11 @@ class PostsImporter extends BaseImporter { let postTags = this.posts_tags, postsWithTags = new Map(), self = this, - tags, - duplicatedTagsPerPost = {}; + duplicatedTagsPerPost = {}, + tagsToAttach = [], + foundOriginalTag; + + postTags = _.orderBy(postTags, ['post_id', 'sort_order'], ['asc', 'asc']); _.each(postTags, function (postTag) { if (!postsWithTags.get(postTag.post_id)) { @@ -52,11 +55,19 @@ class PostsImporter extends BaseImporter { }); postsWithTags.forEach(function (tagIds, postId) { - tags = _.filter(self.tags, function (tag) { - return _.indexOf(tagIds, tag.id) !== -1; + tagsToAttach = []; + + _.each(tagIds, function (tagId) { + foundOriginalTag = _.find(self.tags, {id: tagId}); + + if (!foundOriginalTag) { + return; + } + + tagsToAttach.push(foundOriginalTag); }); - _.each(tags, function (tag) { + _.each(tagsToAttach, function (tag) { _.each(self.dataToImport, function (obj) { if (obj.id === postId) { if (!_.isArray(obj.tags)) { diff --git a/core/test/integration/data/importer/importers/data_spec.js b/core/test/integration/data/importer/importers/data_spec.js index 184eb08a00..92f84cd14b 100644 --- a/core/test/integration/data/importer/importers/data_spec.js +++ b/core/test/integration/data/importer/importers/data_spec.js @@ -9,6 +9,7 @@ var should = require('should'), // Stuff we are testing db = require('../../../../../server/data/db'), + models = require('../../../../../server/models'), exporter = require('../../../../../server/data/export'), importer = require('../../../../../server/data/importer'), dataImporter = importer.importers[1], @@ -494,6 +495,54 @@ describe('Import', function () { }); }); + describe('004: order', function () { + beforeEach(testUtils.setup('roles', 'owner', 'settings')); + + it('ensure post tag order is correct', function (done) { + var exportData; + + testUtils.fixtures.loadExportFixture('export-004').then(function (exported) { + exportData = exported; + return dataImporter.doImport(exportData); + }).then(function () { + // Grab the data from tables + // NOTE: we have to return sorted data, sqlite can insert the posts in a different order + return Promise.all([ + models.Post.findPage({include: ['tags']}), + models.Tag.findAll() + ]); + }).then(function (importedData) { + should.exist(importedData); + + importedData.length.should.equal(2, 'Did not get data successfully'); + + var posts = importedData[0].posts, + tags = importedData[1]; + + // test posts + posts.length.should.equal(exportData.data.posts.length, 'Wrong number of posts'); + posts[0].tags.length.should.eql(1); + posts[0].tags[0].slug.should.eql(exportData.data.tags[0].slug); + + // has a specific sort_order + posts[1].tags.length.should.eql(3); + posts[1].tags[0].slug.should.eql(exportData.data.tags[2].slug); + posts[1].tags[1].slug.should.eql(exportData.data.tags[0].slug); + posts[1].tags[2].slug.should.eql(exportData.data.tags[1].slug); + + // sort_order property is missing (order depends on the posts_tags entries) + posts[2].tags.length.should.eql(2); + posts[2].tags[0].slug.should.eql(exportData.data.tags[1].slug); + posts[2].tags[1].slug.should.eql(exportData.data.tags[0].slug); + + // test tags + tags.length.should.equal(exportData.data.tags.length, 'no new tags'); + + done(); + }).catch(done); + }); + }); + describe('Validation', function () { beforeEach(testUtils.setup('roles', 'owner', 'settings')); diff --git a/core/test/utils/fixtures/export/export-004.json b/core/test/utils/fixtures/export/export-004.json new file mode 100644 index 0000000000..69d076579e --- /dev/null +++ b/core/test/utils/fixtures/export/export-004.json @@ -0,0 +1,457 @@ +{ + "meta": { + "exported_on": 1388318311015, + "version": "003" + }, + "data": { + "posts": [ + { + "id": 1, + "uuid": "8492fbba-1102-4b53-8e3e-abe207952f0c", + "title": "Welcome to Ghost", + "slug": "welcome-to-ghost", + "markdown": "You're live! Nice.", + "html": "

You're live! Nice.

", + "image": null, + "featured": 0, + "page": 0, + "status": "published", + "language": "en_US", + "meta_title": null, + "meta_description": null, + "author_id": 1, + "created_at": 1425164400000, + "created_by": 1, + "updated_at": 1425164400000, + "updated_by": 1, + "published_at": 1425164400000, + "published_by": 1 + }, + { + "id": 2, + "uuid": "8492fbba-1102-4b53-8e3e-abe207952f0c", + "title": "order test", + "slug": "order-test", + "markdown": "order test", + "html": "

Order Test.

", + "image": null, + "featured": 0, + "page": 0, + "status": "published", + "language": "en_US", + "meta_title": null, + "meta_description": null, + "author_id": 1, + "created_at": 1267398000000, + "created_by": 1, + "updated_at": 1267398000000, + "updated_by": 1, + "published_at": 1267398000000, + "published_by": 1 + }, + { + "id": 3, + "uuid": "8492fbba-1102-4b53-8e3e-abe207952f0c", + "title": "has no sort order", + "slug": "no-order-test", + "markdown": "no-order test", + "html": "

No Order Test.

", + "image": null, + "featured": 0, + "page": 0, + "status": "published", + "language": "en_US", + "meta_title": null, + "meta_description": null, + "author_id": 1, + "created_at": 1362092400000, + "created_by": 1, + "updated_at": 1362092400000, + "updated_by": 1, + "published_at": 1362092400000, + "published_by": 1 + } + ], + "users": [ + { + "id": 1, + "uuid": "e5188224-4742-4c32-a2d6-e9c5c5d4c123", + "name": "Joe Bloggs", + "slug": "joe-bloggs", + "password": "$2a$10$.pZeeBE0gHXd0PTnbT/ph.GEKgd0Wd3q2pWna3ynTGBkPKnGIKABC", + "email": "jbloggs@example.com", + "image": null, + "cover": null, + "bio": "A blogger", + "website": null, + "location": null, + "accessibility": null, + "status": "active", + "language": "en_US", + "meta_title": null, + "meta_description": null, + "last_login": null, + "created_at": 1388319501897, + "created_by": 1, + "updated_at": null, + "updated_by": null + } + ], + "roles": [ + { + "id": 1, + "uuid": "d2ea9c7f-7e6b-4cae-b009-35c298206852", + "name": "Administrator", + "description": "Administrators", + "created_at": 1388318310794, + "created_by": 1, + "updated_at": 1388318310794, + "updated_by": 1 + }, + { + "id": 2, + "uuid": "b0d7d6b0-5b88-45b5-b0e5-a487741b843d", + "name": "Editor", + "description": "Editors", + "created_at": 1388318310796, + "created_by": 1, + "updated_at": 1388318310796, + "updated_by": 1 + }, + { + "id": 3, + "uuid": "9f72e817-5490-4ccf-bc78-c557dc9613ca", + "name": "Author", + "description": "Authors", + "created_at": 1388318310799, + "created_by": 1, + "updated_at": 1388318310799, + "updated_by": 1 + } + ], + "roles_users": [ + { + "id": 1, + "role_id": 1, + "user_id": 1 + } + ], + "permissions": [ + { + "id": 1, + "uuid": "bdfbd261-e0fb-4c8e-abab-aece7a9e8e34", + "name": "Edit posts", + "object_type": "post", + "action_type": "edit", + "object_id": null, + "created_at": 1388318310803, + "created_by": 1, + "updated_at": 1388318310803, + "updated_by": 1 + }, + { + "id": 2, + "uuid": "580d31c4-e3db-40f3-969d-9a1caea9d1bb", + "name": "Remove posts", + "object_type": "post", + "action_type": "remove", + "object_id": null, + "created_at": 1388318310814, + "created_by": 1, + "updated_at": 1388318310814, + "updated_by": 1 + }, + { + "id": 3, + "uuid": "c1f8b024-e383-494a-835d-6fb673f143db", + "name": "Create posts", + "object_type": "post", + "action_type": "create", + "object_id": null, + "created_at": 1388318310818, + "created_by": 1, + "updated_at": 1388318310818, + "updated_by": 1 + } + ], + "permissions_users": [], + "permissions_roles": [ + { + "id": 1, + "role_id": 1, + "permission_id": 1 + }, + { + "id": 2, + "role_id": 1, + "permission_id": 2 + }, + { + "id": 3, + "role_id": 1, + "permission_id": 3 + } + ], + "settings": [ + { + "id": 2, + "uuid": "95ce1c53-69b0-4f5f-be91-d3aeb39046b5", + "key": "dbHash", + "value": null, + "type": "core", + "created_at": 1388318310829, + "created_by": 1, + "updated_at": 1388318310829, + "updated_by": 1 + }, + { + "id": 3, + "uuid": "c356fbde-0bc5-4fe1-9309-2510291aa34d", + "key": "title", + "value": "Ghost", + "type": "blog", + "created_at": 1388318310830, + "created_by": 1, + "updated_at": 1388318310830, + "updated_by": 1 + }, + { + "id": 4, + "uuid": "858dc11f-8f9e-4011-99ee-d94c48d5a2ce", + "key": "description", + "value": "Just a blogging platform.", + "type": "blog", + "created_at": 1388318310830, + "created_by": 1, + "updated_at": 1388318310830, + "updated_by": 1 + }, + { + "id": 5, + "uuid": "37ca5ae7-bca6-4dd5-8021-4ef6c6dcb097", + "key": "email", + "value": "josephinebloggs@example.com", + "type": "blog", + "created_at": 1388318310830, + "created_by": 1, + "updated_at": 1388318310830, + "updated_by": 1 + }, + { + "id": 6, + "uuid": "1672d62c-fab7-4f22-b333-8cf760189f67", + "key": "logo", + "value": "", + "type": "blog", + "created_at": 1388318310830, + "created_by": 1, + "updated_at": 1388318310830, + "updated_by": 1 + }, + { + "id": 7, + "uuid": "cd8b0456-578b-467a-857e-551bad17a14d", + "key": "cover", + "value": "", + "type": "blog", + "created_at": 1388318310830, + "created_by": 1, + "updated_at": 1388318310830, + "updated_by": 1 + }, + { + "id": 8, + "uuid": "c4a074a4-05c7-49f7-83eb-068302c15d82", + "key": "defaultLang", + "value": "en_US", + "type": "blog", + "created_at": 1388318310830, + "created_by": 1, + "updated_at": 1388318310830, + "updated_by": 1 + }, + { + "id": 9, + "uuid": "21f2f5da-9bee-4dae-b3b7-b8d7baf8be33", + "key": "postsPerPage", + "value": "6", + "type": "blog", + "created_at": 1388318310830, + "created_by": 1, + "updated_at": 1388318310830, + "updated_by": 1 + }, + { + "id": 10, + "uuid": "2d21b736-f85a-4119-a0e3-5fc898b1bf47", + "key": "forceI18n", + "value": "true", + "type": "blog", + "created_at": 1388318310831, + "created_by": 1, + "updated_at": 1388318310831, + "updated_by": 1 + }, + { + "id": 11, + "uuid": "5c5b91b8-6062-4104-b855-9e121f72b0f0", + "key": "permalinks", + "value": "/:slug/", + "type": "blog", + "created_at": 1388318310831, + "created_by": 1, + "updated_at": 1388318310831, + "updated_by": 1 + }, + { + "id": 12, + "uuid": "795cb328-3e38-4906-81a8-fcdff19d914f", + "key": "activeTheme", + "value": "notcasper", + "type": "theme", + "created_at": 1388318310831, + "created_by": 1, + "updated_at": 1388318310831, + "updated_by": 1 + }, + { + "id": 13, + "uuid": "f3afce35-5166-453e-86c3-50dfff74dca7", + "key": "activeApps", + "value": "[]", + "type": "plugin", + "created_at": 1388318310831, + "created_by": 1, + "updated_at": 1388318310831, + "updated_by": 1 + }, + { + "id": 14, + "uuid": "2ea560a3-2304-449d-a62b-f7b622987510", + "key": "installedApps", + "value": "[]", + "type": "plugin", + "created_at": 1388318310831, + "created_by": 1, + "updated_at": 1388318310831, + "updated_by": 1 + } + ], + "tags": [ + { + "id": 1, + "uuid": "a950117a-9735-4584-931d-25a28015a80d", + "name": "two", + "slug": "two", + "description": null, + "parent_id": null, + "meta_title": null, + "meta_description": null, + "created_at": 1388318310790, + "created_by": 1, + "updated_at": 1388318310790, + "updated_by": 1 + }, + { + "id": 2, + "uuid": "a950117a-9735-4584-931d-25a28015a80d", + "name": "one", + "slug": "one", + "description": null, + "parent_id": null, + "meta_title": null, + "meta_description": null, + "created_at": 1388318310790, + "created_by": 1, + "updated_at": 1388318310790, + "updated_by": 1 + }, + { + "id": 3, + "uuid": "a950117a-9735-4584-931d-25a28015a80d", + "name": "three", + "slug": "three", + "description": null, + "parent_id": null, + "meta_title": null, + "meta_description": null, + "created_at": 1388318310790, + "created_by": 1, + "updated_at": 1388318310790, + "updated_by": 1 + } + ], + "posts_tags": [ + { + "id": 1, + "post_id": 1, + "tag_id": 1 + }, + { + "id": 2, + "post_id": 2, + "tag_id": 2, + "sort_order": 0 + }, + { + "id": 3, + "post_id": 2, + "tag_id": 1, + "sort_order": 1 + }, + { + "id": 4, + "post_id": 3, + "tag_id": 3 + }, + { + "id": 5, + "post_id": 3, + "tag_id": 1 + }, + { + "id": 6, + "post_id": 3, + "tag_id": 2 + } + ], + "apps": [ + { + "id": 1, + "uuid": "4d7557f0-0949-4946-9fe8-ec030e0727f0", + "name": "Kudos", + "slug": "kudos", + "version": "0.0.1", + "status": "installed", + "created_at": 1388318312790, + "created_by": 1, + "updated_at": 1388318312790, + "updated_by": 1 + } + ], + "app_settings": [ + { + "id": 1, + "uuid": "790e4551-b9cc-4954-8f5d-b6e651bc7342", + "key": "position", + "value": "bottom", + "app_id": 1, + "created_at": 1388318312790, + "created_by": 1, + "updated_at": 1388318312790, + "updated_by": 1 + }, + { + "id": 2, + "uuid": "29682b66-cdeb-4773-9821-bcf40ea93b58", + "key": "size", + "value": "60", + "app_id": 1, + "created_at": 1388318312790, + "created_by": 1, + "updated_at": 1388318312790, + "updated_by": 1 + } + ] + } +}