Alvin
Alvin

Reputation: 8499

Transaction for collection

How can I do using transacting t, I want to make sure the row is successful remove before saving the record:

var Roles = bookshelf.Collection.extend({
     model: Role
);

Role.where('name', '=', 'Staff').destroy();

var roles = Roles.forge([{name: 'Staff'}, {name: 'Guest'}]);

Promise.all(roles.invoke('save')).then(function(role) {
    resolve(role);
}).catch(function (err) {
    reject({"status":"error", "data": err});
});

Upvotes: 3

Views: 3044

Answers (1)

flaviodesousa
flaviodesousa

Reputation: 7815

You may just use Bookshelf's transaction() method.

But first your save() MUST be in the context of the destroy() promise, so ensuring proper sequence, otherwise you risk having your saved data being also deleted by the destroy.

So it may look like:

var Roles = bookshelf.Collection.extend({
  model: Role
});

bookshelf.transaction(function(t) {
  return Role
    .where('name', '=', 'Staff')
    .destroy({transacting: t})
    .then(function() {
      var roles = Roles.forge([{name: 'Staff'}, {name: 'Guest'}]);
      return roles
        .invokeThen('save', null, {transacting: t});
    });
});

Upvotes: 4

Related Questions