Δημιουργήστε έναν πλήρη πόρο REST με actions
Ένας πόρος REST είναι έξι λειτουργίες: λίστα (query), read, insert, update (αντικατάσταση), patch (αλλαγή λίγων πεδίων) και remove. Στο Total.js καθεμία είναι ένα action με τη δική του επικύρωση, έτσι ο πίνακας διαδρομών μένει μια απλή αντιστοίχιση από URL σε action. Το params επικυρώνει το id του URL, το query τα φίλτρα της λίστας, το input το σώμα. Μέσα σε ένα action τα $.params, $.query και το επικυρωμένο σώμα (δεύτερο όρισμα του action) είναι ήδη καθαρές τιμές.
Αναφέρετε μια εγγραφή που λείπει με $.invalid(404): απαντά με τον κωδικό κατάστασης και ένα σφάλμα JSON, με τον ίδιο τρόπο σε κάθε action. Το $.success() απαντά { "success": true } και το $.callback(value) απαντά με μια τιμή, η οποία φιλτράρεται επιπλέον από το output του action. Το UID() δημιουργεί το id μιας νέας εγγραφής.
Το patch χρειάζεται partial: true. Χωρίς αυτό, ένα πεδίο που δεν στάλθηκε συμπληρώνεται παρ' όλα αυτά με την προεπιλεγμένη τιμή του τύπου του ('' για ένα String) και το update() θα αντικαθιστούσε την αποθηκευμένη τιμή με αυτό το κενό κείμενο. Με partial: true στο action φτάνουν μόνο τα πεδία που υπάρχουν στο αίτημα.
NEWACTION('Products/query', {
name: 'List products',
query: 'page:Number, search:String',
output: 'items:[id:UID, name:String, price:Number], page:Number',
action: function($) {
var page = $.query.page || 1;
var builder = NOSQL('products').find().sort('name').take(10).skip((page - 1) * 10);
if ($.query.search)
builder.search('name', $.query.search);
builder.callback((err, items) => $.callback({ items: items, page: page }));
}
});
NEWACTION('Products/read', {
name: 'Read a product',
params: '*id:UID',
output: 'id:UID, name:String, price:Number',
action: function($) {
NOSQL('products').read().where('id', $.params.id).callback(function(err, item) {
if (item)
$.callback(item);
else
$.invalid(404);
});
}
});
NEWACTION('Products/insert', {
name: 'Create a product',
input: '*name:String, *price:Number',
action: function($, model) {
model.id = UID();
NOSQL('products').insert(model).callback(() => $.callback({ id: model.id }));
}
});
NEWACTION('Products/update', {
name: 'Replace a product',
params: '*id:UID',
input: '*name:String, *price:Number',
action: function($, model) {
NOSQL('products').update(model).where('id', $.params.id).callback(function(err, count) {
if (count)
$.success();
else
$.invalid(404);
});
}
});
NEWACTION('Products/patch', {
name: 'Change some fields of a product',
partial: true,
params: '*id:UID',
input: 'name:String, price:Number',
action: function($, model) {
NOSQL('products').update(model).where('id', $.params.id).callback(function(err, count) {
if (count)
$.success();
else
$.invalid(404);
});
}
});
NEWACTION('Products/remove', {
name: 'Remove a product',
params: '*id:UID',
action: function($) {
NOSQL('products').remove().where('id', $.params.id).callback(function(err, count) {
if (count)
$.success();
else
$.invalid(404);
});
}
});exports.install = function() {
ROUTE('GET /products/ --> *Products/query');
ROUTE('GET /products/{id}/ --> *Products/read');
ROUTE('POST /products/ --> *Products/insert');
ROUTE('PUT /products/{id}/ --> *Products/update');
ROUTE('PATCH /products/{id}/ --> *Products/patch');
ROUTE('DELETE /products/{id}/ --> *Products/remove');
};