-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbackbone-adapter.js
87 lines (80 loc) · 2.22 KB
/
backbone-adapter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
var db = require('db'),
Backbone = require('backbone'),
_ = require('underscore')._;
exports.find = function (db, model, callback) {
db.getDoc(model.attributes._id, callback);
};
exports.findAll = function (db, model, callback) {
var view = model.view;
if (!view) {
return callback('No view defined');
}
if (!view.ddoc) {
return callback('Missing design doc name');
}
if (!view.name) {
return callback('Missing view name');
}
if (!view.query) {
view.query = {};
}
// backbone-adapter always needs the whole doc
view.query.include_docs = true;
db.getView(view.ddoc, view.name, view.query, function (err, data) {
if (err) {
return callback(err);
}
var docs = _.map(data.rows, function (row) {
return row.doc;
});
callback(null, docs);
});
};
exports.save = function (db, model, callback) {
db.saveDoc(model.attributes, function (err, resp) {
if (err) {
return callback(err);
}
model.attributes._id = resp.id;
model.attributes._rev = resp.rev;
callback(null, model.attributes);
});
};
exports.remove = function (db, model, callback) {
db.removeDoc(model.attributes, callback);
};
exports.sync = function (method, model, options) {
var db_url = model.db;
if (!db_url && model.collection) {
// try collection db url
db_url = model.collection.db;
}
if (!db_url) {
// use app-wide db url
db_url = Backbone.db;
}
var callback = function (err) {
if (err) {
return options.error(model, err);
}
var args = Array.prototype.slice.call(arguments, 1);
options.success.apply(model, args);
};
if (!db_url) {
return callback(
new Error("DB not defined")
);
}
var actions = {
'read': model._id ? exports.find: exports.findAll,
'create': exports.save,
'update': exports.save,
'delete': exports.remove
};
if (!actions[method]) {
return callback(
new Error('Unknown method: ' + method)
);
}
actions[method](db.use(db_url), model, callback);
};