From ff38a1530676fe4ef1abb04ce46472f17b94b5e3 Mon Sep 17 00:00:00 2001 From: Ruben Vereecken Date: Fri, 12 Dec 2014 21:58:11 +0100 Subject: [PATCH 1/2] Entries get updated when field slugs change Uses a virtual `old.slug` to keep track of the old Field slug. If it changes a `post save` will make sure all related Fields get renamed as well. Should be changed along with the rest of the changes for #168 (assembly). --- server/models/bucket.coffee | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/server/models/bucket.coffee b/server/models/bucket.coffee index b69f0c2..7e9c103 100644 --- a/server/models/bucket.coffee +++ b/server/models/bucket.coffee @@ -1,6 +1,7 @@ inflection = require 'inflection' mongoose = require 'mongoose' uniqueValidator = require 'mongoose-unique-validator' +winston = require 'winston' Route = require '../models/route' db = require '../lib/database' @@ -21,6 +22,9 @@ fieldSchema = new mongoose.Schema type: String required: yes settings: {} +, + toJSON: + getters: true fieldSchema .path 'slug' @@ -40,6 +44,26 @@ fieldSchema ] , 'Sorry, that’s a reserved field slug.' +fieldSchema.virtual 'slug.old' + .get -> @_slug + .set (slug) -> @_slug = slug + +fieldSchema.post 'init', -> + @set 'slug.old', @get 'slug' + +fieldSchema.post 'save', -> + if @get('slug.old') isnt @get('slug') + oldPath = "content.#{@get 'slug.old'}" + newPath = "content.#{@get 'slug'}" + q = {} + q[oldPath] = $exists: yes + u = {$rename: {}} + u.$rename[oldPath] = newPath + + # TODO will probably have to change due to #168 + mongoose.model('Entry').update q, u, {}, (err) -> + winston.error err if err? + bucketSchema = new mongoose.Schema name: type: String From c90f65792ccb5f2a0498da1a9399f27775c3e1b7 Mon Sep 17 00:00:00 2001 From: Ruben Vereecken Date: Wed, 17 Dec 2014 15:56:51 +0100 Subject: [PATCH 2/2] Wrote test for slug renaming in Buckets --- server/models/bucket.coffee | 9 ++--- test/server/models/bucket.coffee | 56 ++++++++++++++++++++++++++++++++ test/server/models/entry.coffee | 2 +- 3 files changed, 62 insertions(+), 5 deletions(-) diff --git a/server/models/bucket.coffee b/server/models/bucket.coffee index 7e9c103..0190188 100644 --- a/server/models/bucket.coffee +++ b/server/models/bucket.coffee @@ -24,7 +24,7 @@ fieldSchema = new mongoose.Schema settings: {} , toJSON: - getters: true + getters: yes fieldSchema .path 'slug' @@ -52,15 +52,16 @@ fieldSchema.post 'init', -> @set 'slug.old', @get 'slug' fieldSchema.post 'save', -> - if @get('slug.old') isnt @get('slug') + # There is a very annoying case where slug.old doesn't get filled in properly + if @get('slug.old') and @get('slug.old') isnt @get('slug') oldPath = "content.#{@get 'slug.old'}" newPath = "content.#{@get 'slug'}" q = {} q[oldPath] = $exists: yes - u = {$rename: {}} + u = $rename: {} u.$rename[oldPath] = newPath - # TODO will probably have to change due to #168 + # careful with this, updates circumvent middleware mongoose.model('Entry').update q, u, {}, (err) -> winston.error err if err? diff --git a/test/server/models/bucket.coffee b/test/server/models/bucket.coffee index 6855da0..b0e3a10 100644 --- a/test/server/models/bucket.coffee +++ b/test/server/models/bucket.coffee @@ -31,6 +31,62 @@ describe 'Model#Bucket', -> expect(bucket.singular).to.equal 'Article' done() + describe 'Update', -> + Entry = require '../../../server/models/entry' + + before reset.db + + user = null + before (done) -> + User.create {name: 'Bucketer', email: 'hello@buckets.io', password: 'S3cr3ts'}, (err, u) -> + expect(err).to.not.exist + user = u + done() + + bucket = null + beforeEach (done) -> + bucket = new Bucket + name: 'Articles' + slug: 'articles' + #fields: [ + # fieldType: 'markdown' + # slug: 'body' + # name: 'body' + #] + bucket.fields.push + fieldType: 'markdown' + slug: 'body' + name: 'body' + bucket.save (err, b) -> + expect(err).to.not.exist + done() + + afterEach (done) -> Bucket.remove {}, -> done() + + it 'updates entry fields when slug changes', (done) -> + Entry.create + title: 'Some Entry' + bucket: bucket._id + author: user._id + content: body: 'Bodyslam' + , (err, entry) -> + expect(err).to.not.exist + expect(entry.get 'content.body').to.exist + + Bucket.findById bucket._id, (err, bucket) -> + field = bucket.get('fields')[0] + field.set 'slug', 'new-body' + + bucket.save (err, field) -> + expect(err).to.not.exist + Entry.find {bucket: bucket._id}, (err, entries) -> + expect(err).to.not.exist + expect(entries.length).to.not.equal 0 + for entry in entries + expect(entry.get 'content.body').to.not.exist + expect(entry.get 'content.new-body').to.exist + done() + describe '#getMembers', -> u = null b = null diff --git a/test/server/models/entry.coffee b/test/server/models/entry.coffee index 08e5770..a290c7f 100644 --- a/test/server/models/entry.coffee +++ b/test/server/models/entry.coffee @@ -9,7 +9,7 @@ reset = require '../../reset' {expect} = require 'chai' -describe 'Entry', -> +describe 'Model#Entry', -> user = null