Skip to content

Commit

Permalink
add relations to protected
Browse files Browse the repository at this point in the history
  • Loading branch information
ivanoff committed Aug 22, 2017
1 parent e79f221 commit 1a01161
Show file tree
Hide file tree
Showing 8 changed files with 219 additions and 33 deletions.
29 changes: 18 additions & 11 deletions controllers/default.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ exports = module.exports = function (name, model) {
if (!q._limit) q._limit = q._per_page;
if (!q._sort) q._sort = q._order;

var start = parseInt(q._start || 0);
var limit = parseInt(q._limit || 10);
var start = parseInt(q._start) || 0;
var limit = parseInt(q._limit) || 10;

var fields = {};
if (q._fields) {
Expand Down Expand Up @@ -101,7 +101,16 @@ exports = module.exports = function (name, model) {
req._log.debug(req._id, name, 'model.get(',
[search, fields, sort, start, limit, rel].prettyJSON().join(', '), ')');

model.get(search, fields, sort, start, limit, rel, function (err, docs) {
var params = {
search: search,
fields: fields,
sort: sort,
start: start,
limit: limit,
rel: rel,
}

model.get(params, function (err, docs) {
if (err) return req._error.show(err);
if (!docs || !docs[0]) return req._error.NOT_FOUND(name, search);

Expand All @@ -119,7 +128,7 @@ exports = module.exports = function (name, model) {
var _this = this;
var search = { _id: req.params._id };
req._log.debug(req._id, name, 'model.get(', search, ', {} , {} , 0 , 1 , null )');
model.get(search, {}, {}, 0, 1, null, function (err, docs) {
model.get({search: search, limit: 1}, function (err, docs) {
if (err) return req._error.show(err);
if (!docs || !docs[0]) return req._error.NOT_FOUND(name.replace(/s$/, ''), search);

Expand Down Expand Up @@ -158,7 +167,7 @@ exports = module.exports = function (name, model) {
if (rel && rel.type1) {
var id = rel.data;
var m = req.models[rel.table1];
m.get({_id: id}, {}, {}, 0, 1, null, function(err,data){
m.get({search: {_id: id}, limit: 1}, function(err,data){
rel.data = doc._id;
data[0] = _this.updateRelationsDoc(rel, data[0], 'type1', 'field1');
m.update(id, {$set: data[0]}, function(){});
Expand All @@ -183,7 +192,7 @@ exports = module.exports = function (name, model) {
if(req.params.login) search.login = req.params.login;
if(req.params.group) search.group = req.params.group;

model.get(search, {}, {}, 0, 1, null, function (err, oldDoc) {
model.get({search: search, limit: 1}, function (err, oldDoc) {
if (Array.isArray(oldDoc)) oldDoc = oldDoc[0];

if (err) return req._error.show(err);
Expand Down Expand Up @@ -214,8 +223,6 @@ exports = module.exports = function (name, model) {

delete: function (req, res, next) {
var rel = this.getRelationsData(req);
console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
console.log(rel);
if(!rel || !rel.data) {
var search = req.params._id? { _id: req.params._id } : {};

Expand All @@ -235,7 +242,7 @@ console.log(rel);
if(req.params.login) search.login = req.params.login;
if(req.params.group) search.group = req.params.group;

m.get(search, {}, {}, null, null, null, function (err, doc) {
m.get({search: search}, function (err, doc) {
var deleted = [];
var updated = [];
doc.forEach( function(d) {
Expand All @@ -245,10 +252,10 @@ console.log(rel);
}
if(!d[rel.field2][0]) {
deleted.push(d._id);
m.delete({_id: d._id}, function(err,ddd){console.log(err,ddd)})
m.delete({_id: d._id}, function(err,obj){})
} else {
updated.push(d._id);
m.update(d._id, {$set:{writers:d[rel.field2]}}, function(err,ddd){console.log(err,ddd)})
m.update(d._id, {$set:{writers:d[rel.field2]}}, function(err,obj){})
}
});
res.json({ ok: 1, deleted: deleted, updated: updated });
Expand Down
3 changes: 3 additions & 0 deletions lib/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -120,8 +120,11 @@ app.model = function (name, model) {
}

log.debug('%s.%s => %s.%s relation added', name, field, l, id);

var extendedName = name + '/:' + name + 'Id/' + l;
if(app._needToken) app.protected[extendedName] = app._needToken;
app.routes[extendedName] = new DefaultRoutes(extendedName, app.controllers[l], app);

app.relations[extendedName] = {
name: name + 'Id',
table1: name,
Expand Down
23 changes: 15 additions & 8 deletions models/default.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,33 @@ module.exports = function (name, model, db) {
return {
object: model,

get: function (search, fields, sort, skip, limit, relation, next) {
if (relation) {
var s = { _id: relation.data };
db.collection(relation.table1).find(s).toArray(function (err, arr) {
get: function (params, next) {
var search = params.search;
var fields = params.fields || {};
var sort = params.sort || {};
var start = params.start || 0;
var limit = params.limit;
var rel = params.rel;

if (rel) {
var s = { _id: rel.data };
db.collection(rel.table1).find(s).toArray(function (err, arr) {
var a = [];
for (var i = 0; i < arr.length; i++) {
var d = arr[i][relation.field1];
var d = arr[i][rel.field1];
if (Array.isArray(d)) {
a = a.concat(d);
} else {
a.push(d);
}
}

search[relation.field2] = { $in: a };
db.collection(name).find(search, fields).sort(sort).skip(skip).limit(limit).toArray(next);
search[rel.field2] = { $in: a };
db.collection(name).find(search, fields).sort(sort).skip(start).limit(limit).toArray(next);
});
} else {
var res = db.collection(name).find(search, fields).sort(sort);
if(skip) res = res.skip(skip);
if(start) res = res.skip(start);
if(limit) res = res.limit(limit);
res.toArray(next);
}
Expand Down
1 change: 1 addition & 0 deletions routes/default.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
'use strict'

module.exports = function (name, controller, app) {

if(app.protected[name]) {
app.use('/' + name, app.checkAccess);
app.use('/my/:login/' + name, app.checkAccess);
Expand Down
15 changes: 15 additions & 0 deletions test/05.error.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ var App = require('../lib/server');
var app = new App();
app._db = require('../lib/db/mongo');

app.use( function (req, res, next) {
req._setOptions();
req._setConfig();
next();
});

app.use( function (req, res, next) {
req._setOptions( {validation: true} );
next();
Expand Down Expand Up @@ -127,6 +133,15 @@ describe('Errors', function () {
app._db.connect(dbUrl, done);
});

it('INTERNAL_SERVER_ERROR', function (done) {
chai.request(app)
.get('/whateverNotF')
.end(function (err, res) {
expect(res).to.have.status(404);
done();
});
});

it('add new', function (done) {
chai.request(app)
.post('/categories')
Expand Down
135 changes: 124 additions & 11 deletions test/12.token.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ appT.use( function (req, res, next) {
require('../routes/login')(appT);

appT.model('messages');
appT.needToken();
appT.needToken({login: 'users.login', password: 'users.password'});
appT.model('ingredients');
appT.model('recipe', {
ingredients: { link: 'ingredients' },
Expand Down Expand Up @@ -283,6 +283,7 @@ describe('Token', function () {
});

describe('/our/admin/ingredients', function () {
var idI;
var id;
it('add one', function (done) {
chai.request(appT)
Expand All @@ -302,30 +303,38 @@ describe('Token', function () {
.end(function (err, res) {
expect(res).to.have.status(200);
expect(res.body).to.be.a('array');
id = res.body[0]._id;
idI = res.body[0]._id;
done();
});
});

it('get one', function (done) {
chai.request(appT)
.get('/our/admin/ingredients/' + id)
.get('/our/admin/ingredients/' + idI)
.set('X-Access-Token', token)
.end(function (err, res) {
expect(res).to.have.status(200);
expect(res.body).to.have.property('name').eql('Tomato');
done();
});
});
});

describe('/our/admin/recipe', function () {
var id;
it('add one', function (done) {
it('add our one', function (done) {
chai.request(appT)
.post('/our/admin/recipe')
.set('X-Access-Token', token)
.send({ name: 'Mashed tomato', ingredients:[id] })
.send({ name: 'Mashed tomato', ingredients:[idI] })
.end(function (err, res) {
expect(res).to.have.status(201);
done();
});
});

it('add our one', function (done) {
chai.request(appT)
.post('/our/admin/recipe')
.set('X-Access-Token', token)
.send({ name: 'Crisps', ingredients:[idI] })
.end(function (err, res) {
expect(res).to.have.status(201);
done();
Expand All @@ -344,6 +353,17 @@ describe('Token', function () {
});
});

it('patch our one', function (done) {
chai.request(appT)
.patch('/our/admin/recipe/' + id)
.set('X-Access-Token', token)
.send({ name: 'Mashed potato', ingredients:[idI] })
.end(function (err, res) {
expect(res).to.have.status(200);
done();
});
});

it('get one', function (done) {
chai.request(appT)
.get('/our/admin/recipe/' + id)
Expand All @@ -355,13 +375,106 @@ describe('Token', function () {
});
});

it('get one reciepe by ingridients', function (done) {
chai.request(appT)
.get('/our/admin/ingredients/' + idI + '/recipe')
.set('X-Access-Token', token)
.end(function (err, res) {
expect(res).to.have.status(200);
expect(res.body[0]).to.have.property('name').eql('Mashed tomato');
expect(res.body[1]).to.have.property('name').eql('Crisps');
done();
});
});

it('delete ingredients', function (done) {
chai.request(appT)
.delete('/our/admin/recipe/' + id + '/ingredients')
.set('X-Access-Token', token)
.end(function (err, res) {
expect(res).to.have.status(200);
expect(res.body).to.have.property('ok').eql(1);
done();
});
});

it('delete recipes', function (done) {
chai.request(appT)
.delete('/our/admin/ingredients/' + idI + '/recipe')
.set('X-Access-Token', token)
.end(function (err, res) {
expect(res).to.have.status(200);
expect(res.body).to.have.property('ok').eql(1);
done();
});
});

it('delete one', function (done) {
chai.request(appT)
.delete('/our/admin/ingredients/' + idI)
.set('X-Access-Token', token)
.end(function (err, res) {
expect(res).to.have.status(404);
done();
});
});

});

describe('/my/admin/recipe', function () {
var id;
it('add our one', function (done) {
chai.request(appT)
.post('/my/admin/recipe')
.set('X-Access-Token', token)
.send({ name: 'Mashed tomato', ingredients:[id] })
.end(function (err, res) {
expect(res).to.have.status(201);
done();
});
});

it('get all', function (done) {
chai.request(appT)
.get('/my/admin/recipe')
.set('X-Access-Token', token)
.end(function (err, res) {
expect(res).to.have.status(200);
expect(res.body).to.be.a('array');
id = res.body[0]._id;
done();
});
});

it('add our one', function (done) {
chai.request(appT)
.patch('/my/admin/recipe/' + id)
.set('X-Access-Token', token)
.send({ name: 'Mashed potato', ingredients:[id] })
.end(function (err, res) {
expect(res).to.have.status(200);
done();
});
});

it('get one', function (done) {
chai.request(appT)
.get('/my/admin/recipe/' + id)
.set('X-Access-Token', token)
.end(function (err, res) {
expect(res).to.have.status(200);
expect(res.body).to.have.property('name').eql('Mashed tomato');
done();
});
});

});

describe('delete from /our/admin/ingredients', function () {
describe('delete from /my/admin/ingredients', function () {
var id;
it('get all', function (done) {
chai.request(appT)
.get('/our/admin/ingredients')
.get('/my/admin/ingredients')
.set('X-Access-Token', token)
.end(function (err, res) {
expect(res).to.have.status(200);
Expand All @@ -373,7 +486,7 @@ describe('Token', function () {

it('delete one', function (done) {
chai.request(appT)
.delete('/our/admin/ingredients/' + id)
.delete('/my/admin/ingredients/' + id)
.set('X-Access-Token', token)
.end(function (err, res) {
expect(res).to.have.status(200);
Expand Down
4 changes: 2 additions & 2 deletions test/13.login.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ describe('Login', function () {
require('../routes/login')(appL);

appL.model('messages');
appL.needToken();
appL.needToken({});
appL.model('ingredients');
});

Expand All @@ -52,7 +52,7 @@ describe('Login', function () {
describe('insert credentials in to database', function () {

it('mongodb mock connection', function (done) {
appL._db.connect(dbUrl, (e,r) => { console.log(e);done(e,r)} );
appL._db.connect(dbUrl, (e,r) => {done(e,r)} );
});

it('insert credentials', function (done) {
Expand Down
Loading

0 comments on commit 1a01161

Please sign in to comment.