-
Notifications
You must be signed in to change notification settings - Fork 0
/
knockrest.js
132 lines (117 loc) · 3.99 KB
/
knockrest.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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// KnockRest Library 0.1
// Helps to interact with a REST API and update the changes
// automatically in your Knockout model objects.
// endpoint: the base of your API
// model: your instance of Knockout model
// idField: the name of your model primary key
var KnockRest = function(endpoint, model, idField) {
var self = this;
// Gets a model by an id
self.get = function(id) {
// Populate the id field to generate the endpoint
self.setId(id);
// Obtains the model and update the data in the knockout model
$.getJSON(self.getIdEndpoint(), function(data) {
self.JsonToModel(data);
});
};
// Gets all your objects
self.list = function() {
$.getJSON(endpoint, function(data) {
//Check if exists the observableArray "list" to populate it
if ($.isFunction(model.list)) {
model.list(data);
}
});
};
// Create or update your object to API
self.save = function() {
var method = (self.isNew() === true) ? 'post' : 'put';
$.ajax({
type: method,
contentType: 'application/json; charset=utf-8',
url: self.getIdEndpoint(),
data: self.modelToJson(),
dataType: 'json',
success: function(data) {
self.clearModel();
},
error: self.manageXhrError
});
};
// Delete a model by an id
self.delete = function() {
if (self.isNew() === false) {
$.ajax({
type: 'delete',
contentType: 'application/json; charset=utf-8',
url: self.getIdEndpoint(),
data: {},
dataType: 'json',
success: self.clearModel,
error: self.manageXhrError
});
}
};
// Manage the error responses from API
self.manageXhrError = function(xhr) {
if (xhr && xhr.status) {
throw xhr.status + ': ' + xhr.statusText;
} else {
throw '000: Unexpected error';
}
};
// Resets the Knockout model to get ready for new changes (insert, get, etc)
self.clearModel = function() {
if (model) {
for (var prop in model) {
// Check if property exists on Knockout model and reset the value
if (model.hasOwnProperty(prop) && ko.isObservable(model[prop])) {
model[prop](undefined);
}
}
// Get all objects
self.list();
}
};
// Update from a JSON object the Knockout model automatically
self.JsonToModel = function(data) {
if (data) {
for (var d in data) {
if ($.isFunction(model[d])) {
model[d](data[d]);
}
}
}
};
// Gets the JSON object from Knockout model to send to API
self.modelToJson = function() {
return ko.toJSON(model);
};
// Sets the Id field value
self.setId = function(id) {
// Check if the id field exist on Knockout model to set the value of it
if ($.isFunction(model[idField])) {
model[idField](id);
} else {
throw 'The function ' + idField + '() does not exists';
}
};
// Gets the Id field value
self.getId = function() {
// Check if the id field exist on Knockout model to return the value of it
if ($.isFunction(model[idField]) && model[idField]()) {
return model[idField]();
} else {
return null;
}
};
// Returns the related endpoint according the id field value
self.getIdEndpoint = function(id) {
return (self.isNew() === false) ? endpoint + '/' + self.getId() : endpoint;
};
// Checks if the Knockout model is a new object or not based on the id field value
self.isNew = function() {
return (self.getId() === null || self.getId() === '' || self.getId() === 0);
};
};