Skip to content

Commit 5e2f5a7

Browse files
Merge pull request #205 from CloudBoost/staging
Staging
2 parents 6783a23 + c615cb8 commit 5e2f5a7

File tree

7 files changed

+302
-181
lines changed

7 files changed

+302
-181
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
[![Build Status](https://travis-ci.org/CloudBoost/cloudboost.svg?branch=master)](https://travis-ci.org/CloudBoost/cloudboost)
44
[![OpenCollective](https://opencollective.com/cloudboost/backers/badge.svg)](#backers)
55

6-
CloudBoost is the Complete NoSQL Database Service for your app. **Think of CloudBoost as Parse + Firebase + Algolia + Iron.io all combined into one** :
6+
CloudBoost is the complete serverless platform for your app. **Think of CloudBoost as Parse + Firebase + Algolia + Iron.io all combined into one** :
77
- Data-Storage / JSON Storage / BLOB Storage
88
- 100% data ownership
99
- Realtime

api/tables/CloudObjects.js

+41-45
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,44 @@
1-
21
/*
32
# CloudBoost - Core Engine that powers Bakend as a Service
4-
# (c) 2014 HackerBay, Inc.
3+
# (c) 2014 HackerBay, Inc.
54
# CloudBoost may be freely distributed under the Apache 2 License
65
*/
76

8-
97
var customHelper = require('../../helpers/custom.js');
108

119
module.exports = function() {
1210

13-
14-
global.app.put('/data/:appId/:tableName', function (req, res) { //save a new document into <tableName> of app
15-
if(req.body && req.body.method=="DELETE"){
11+
global.app.put('/data/:appId/:tableName', function(req, res) { //save a new document into <tableName> of app
12+
if (req.body && req.body.method == "DELETE") {
1613
/******************DELETE API*********************/
1714
_deleteApi(req, res);
1815
/******************DELETE API*********************/
19-
}else{
16+
} else {
2017
/******************SAVE API*********************/
2118
console.log("SAVE API");
2219
var appId = req.params.appId;
2320
var document = req.body.document;
2421
var collectionName = req.params.tableName;
2522
var appKey = req.body.key || req.params.key;
2623
var sdk = req.body.sdk || "REST";
27-
28-
global.appService.isMasterKey(appId, appKey).then(function (isMasterKey) {
24+
25+
global.appService.isMasterKey(appId, appKey).then(function(isMasterKey) {
2926
return global.customService.save(appId, collectionName, document, customHelper.getAccessList(req), isMasterKey);
30-
}).then(function (result) {
27+
}).then(function(result) {
3128
console.log('+++ Save Success +++');
3229
console.log(result);
3330
res.status(200).send(result);
34-
}, function (error) {
31+
}, function(error) {
3532
console.log('++++++ Save Error +++++++');
3633
console.log(error);
3734
res.status(400).send(error);
3835
});
3936

40-
global.apiTracker.log(appId,"Object / Save", req.url,sdk);
37+
global.apiTracker.log(appId, "Object / Save", req.url, sdk);
4138
/******************SAVE API*********************/
4239
}
4340
});
44-
45-
41+
4642
global.app.get('/data/:appId/:tableName/find', _getData);
4743
global.app.post('/data/:appId/:tableName/find', _getData);
4844

@@ -54,8 +50,8 @@ module.exports = function() {
5450

5551
global.app.get('/data/:appId/:tableName/findOne', _findOne);
5652
global.app.post('/data/:appId/:tableName/findOne', _findOne);
57-
58-
global.app.delete('/data/:appId/:tableName', _deleteApi);
53+
54+
global.app.delete('/data/:appId/:tableName', _deleteApi);
5955

6056
function _deleteApi(req, res) { //delete a document matching the <objectId>
6157
console.log("DELETE API");
@@ -65,16 +61,16 @@ module.exports = function() {
6561
var appKey = req.body.key || req.param('key');
6662
var sdk = req.body.sdk || "REST";
6763

68-
global.appService.isMasterKey(appId,appKey).then(function(isMasterKey){
69-
return global.customService.delete(appId, collectionName, document, customHelper.getAccessList(req),isMasterKey);
64+
global.appService.isMasterKey(appId, appKey).then(function(isMasterKey) {
65+
return global.customService.delete(appId, collectionName, document, customHelper.getAccessList(req), isMasterKey);
7066
}).then(function(result) {
7167
res.json(result);
7268
}, function(error) {
7369
res.status(400).send(error);
7470
});
75-
76-
global.apiTracker.log(appId,"Object / Delete", req.url,sdk);
77-
71+
72+
global.apiTracker.log(appId, "Object / Delete", req.url, sdk);
73+
7874
}
7975

8076
};
@@ -90,16 +86,16 @@ function _getData(req, res) { //get document(s) object based on query and variou
9086
var skip = req.body.skip;
9187
var appKey = req.body.key || req.param('key');
9288
var sdk = req.body.sdk || "REST";
93-
94-
global.appService.isMasterKey(appId, appKey).then(function (isMasterKey) {
89+
90+
global.appService.isMasterKey(appId, appKey).then(function(isMasterKey) {
9591
return global.customService.find(appId, collectionName, query, select, sort, limit, skip, customHelper.getAccessList(req), isMasterKey);
96-
}).then(function (results) {
92+
}).then(function(results) {
9793
res.json(results);
98-
}, function (error) {
94+
}, function(error) {
9995
res.status(400).send(error);
10096
});
101-
102-
global.apiTracker.log(appId,"Object / Find", req.url,sdk);
97+
98+
global.apiTracker.log(appId, "Object / Find", req.url, sdk);
10399
}
104100

105101
function _count(req, res) { //get document(s) object based on query and various parameters
@@ -111,16 +107,16 @@ function _count(req, res) { //get document(s) object based on query and various
111107
var skip = req.body.skip;
112108
var appKey = req.body.key || req.param('key');
113109
var sdk = req.body.sdk || "REST";
114-
115-
global.appService.isMasterKey(appId, appKey).then(function (isMasterKey) {
110+
111+
global.appService.isMasterKey(appId, appKey).then(function(isMasterKey) {
116112
return global.customService.count(appId, collectionName, query, limit, skip, customHelper.getAccessList(req), isMasterKey);
117-
}).then(function (result) {
113+
}).then(function(result) {
118114
res.json(result);
119-
}, function (error) {
115+
}, function(error) {
120116
res.status(400).send(error);
121117
});
122-
123-
global.apiTracker.log(appId,"Object / Count", req.url,sdk);
118+
119+
global.apiTracker.log(appId, "Object / Count", req.url, sdk);
124120
}
125121

126122
function _distinct(req, res, next) { //get document(s) object based on query and various parameters
@@ -135,16 +131,16 @@ function _distinct(req, res, next) { //get document(s) object based on query and
135131
var skip = req.body.skip;
136132
var appKey = req.body.key || req.param('key');
137133
var sdk = req.body.sdk || "REST";
138-
139-
global.appService.isMasterKey(appId, appKey).then(function (isMasterKey) {
134+
135+
global.appService.isMasterKey(appId, appKey).then(function(isMasterKey) {
140136
return global.customService.distinct(appId, collectionName, onKey, query, select, sort, limit, skip, customHelper.getAccessList(req), isMasterKey);
141-
}).then(function (results) {
137+
}).then(function(results) {
142138
res.json(results);
143-
}, function (error) {
139+
}, function(error) {
144140
res.status(400).send(error);
145141
});
146-
147-
global.apiTracker.log(appId,"Object / Distinct", req.url,sdk);
142+
143+
global.apiTracker.log(appId, "Object / Distinct", req.url, sdk);
148144
}
149145

150146
function _findOne(req, res) { //get a single document matching the search query
@@ -157,14 +153,14 @@ function _findOne(req, res) { //get a single document matching the search query
157153
var skip = req.body.skip;
158154
var appKey = req.body.key || req.param('key');
159155
var sdk = req.body.sdk || "REST";
160-
161-
global.appService.isMasterKey(appId, appKey).then(function (isMasterKey) {
156+
157+
global.appService.isMasterKey(appId, appKey).then(function(isMasterKey) {
162158
return global.customService.findOne(appId, collectionName, query, select, sort, skip, customHelper.getAccessList(req), isMasterKey);
163-
}).then(function (result) {
159+
}).then(function(result) {
164160
res.json(result);
165-
}, function (error) {
161+
}, function(error) {
166162
res.status(400).send(error);
167163
});
168-
169-
global.apiTracker.log(appId,"Object / FindOne", req.url,sdk);
164+
165+
global.apiTracker.log(appId, "Object / FindOne", req.url, sdk);
170166
}

database-connect/realTime.js

+9-6
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,8 @@ module.exports = function(io) {
153153

154154
});
155155

156-
g.sendObjectNotification = function(appId, document, eventType) {
156+
g.sendObjectNotification = function(appId, document, eventType, isMasterKey) {
157+
//pass masterkey to access events as default ACL for event R/W is set to false
157158
try {
158159
//event type can be created, updated, deleted.
159160
if (document && document._tableName) {
@@ -171,13 +172,13 @@ module.exports = function(io) {
171172
if (typeof sockets === "object") {
172173
for (var key in sockets) {
173174
if (sockets[key]) {
174-
promises.push(_sendNotification(appId, document, sockets[key], eventType));
175+
promises.push(_sendNotification(appId, document, sockets[key], eventType, isMasterKey));
175176
}
176177
}
177178
} else {
178179
for (var i = 0; i < sockets.length; i++) {
179180
var socket = sockets[i];
180-
promises.push(_sendNotification(appId, document, socket, eventType));
181+
promises.push(_sendNotification(appId, document, socket, eventType, isMasterKey));
181182
}
182183
}
183184

@@ -202,14 +203,15 @@ module.exports = function(io) {
202203
/**
203204
*/
204205

205-
function _sendNotification(appId, document, socket, eventType) {
206+
function _sendNotification(appId, document, socket, eventType, isMasterKey) {
207+
//pass masterkey to access events as default ACL for event R/W is set to false
206208
var deferred = global.q.defer();
207209
try {
208210
global.socketSessionHelper.getSession(socket.id, function(err, session) {
209211
if (err) {
210212
deferred.reject();
211213
}
212-
if (!session || global.aclHelper.isAllowedReadAccess(session.userId, session.roles, document.ACL)) {
214+
if (!session || global.aclHelper.isAllowedReadAccess(session.userId, session.roles, document.ACL) || isMasterKey) {
213215
global.socketQueryHelper.getData(socket.id, eventType, function(err, socketData) {
214216
var socketQueryValidate = true;
215217
if (socketData && socketData.query)
@@ -219,8 +221,9 @@ function _sendNotification(appId, document, socket, eventType) {
219221
socketData = {
220222
timestamp: ''
221223
};
224+
console.log(appId.toLowerCase() + 'table' + document._tableName.toLowerCase() + eventType.toLowerCase() + socketData.timestamp)
222225
socket.emit(appId.toLowerCase() + 'table' + document._tableName.toLowerCase() + eventType.toLowerCase() + socketData.timestamp, JSON.stringify(document));
223-
console.log("Socket Emitteddddddddddddddddddddddddddddddddddddd.", document);
226+
console.log("Socket Emited.", document);
224227
} else {
225228
console.log('Socket Query doesn\'t satsfies the current document');
226229
}

databases/mongo.js

+7
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,13 @@ module.exports = function() {
295295
if (!sort) {
296296
sort = {};
297297
}
298+
//default sort added
299+
/*
300+
without sort if limit and skip are used, the records are returned out of order. To solve this default sort in ascending order of 'createdAt' is added
301+
*/
302+
303+
if (!sort['createdAt'])
304+
sort['createdAt'] = 1
298305

299306
if (!limit || limit === -1) {
300307
limit = 20;

0 commit comments

Comments
 (0)