Compare commits

18 Commits

Author SHA1 Message Date
Amra Šabić
17f8746703 working on json, db21.json first pass, db.json latest attempt 2018-02-18 19:08:20 +01:00
Amra Šabić
9174647b67 update readme 2018-02-18 15:22:31 +01:00
Amra Šabić
07bfc615bf add db.json 2018-02-18 15:14:08 +01:00
Amra Šabić
61389a98f7 API calls - added json-server, db.json to mock api calls 2018-02-18 15:13:39 +01:00
Amra Šabić
419993262d naming convention 2018-02-18 13:36:42 +01:00
Amra Šabić
36a4fb4272 modify spacing 2018-02-18 08:43:10 +01:00
Amra Šabić
ce90f496d1 add TODO for up-next tasks - api calls 2018-02-17 18:34:11 +01:00
Amra Šabić
2362d417d6 add new files 2018-02-17 18:28:39 +01:00
Amra Šabić
4d47c08182 add few models, keep everything apart for now, maybe separate routes 2018-02-17 18:28:16 +01:00
Amra Šabić
a51eb8cb0a modify userModel properties 2018-02-17 18:00:22 +01:00
Amra Šabić
283634765b Merge branch 'development' of github.com:senaduka/amras-zadatak1 into development 2018-02-17 11:51:52 +01:00
Amra Šabić
ad6ffd0d89 add - getting started to README.md 2018-02-17 11:51:03 +01:00
Amra Šabić
fda840d119 added mongose and express, modified server, for testing purpose added user controller, model and routes 2018-02-17 11:44:35 +01:00
Amra Šabić
e51d046374 server setup 2018-02-17 11:12:33 +01:00
Amra Šabić
14f42b113e server setup 2018-02-17 11:12:19 +01:00
Šabić Amra
8c7cfb08da Delete vcs.xml 2018-02-17 11:03:59 +01:00
Šabić Amra
3e0f41ef26 Delete vcs.xml 2018-02-17 09:02:19 +01:00
Amra Šabić
f75bf59ef3 update README.md - initial changes 2018-02-17 09:00:18 +01:00
14 changed files with 4956 additions and 1 deletions

5
.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
# Dependency directories
node_modules
# Editor
.idea

View File

@@ -1,2 +1,18 @@
# amras-zadatak1
amra sabic zadatak 1
## OBJECTIVE
Design and implement a performant and elegant backend API for managing user permissions database.
The goal is to quickly prototype an end-to-end app with the basic functionality specified.
### TASK ONE
Build JSON-based, database-backed, API for managing a list of user and associated permissions.
##### Getting started
- Required Node and MongoDB
- Install: ` npm install `
- Start project with: ` npm run start ` or run ` node server.js ` depending on the server.js file content
### TASK TWO
Create a Javascript "Permission Control Panel" front-end web page controlling User Permissions.

View File

@@ -0,0 +1,28 @@
'use strict';
var mongoose = require('mongoose'),
Group = mongoose.model('Group');
exports.list_all = function(req, res) {
Group.find({}, function(err, group) {
if (err) {
res.send(err);
}
res.json(group);
});
};
exports.add_group = function(req, res) {
var new_group = new Group(req.body);
new_group.save(function(err, group) {
if (err) {
res.send(err);
}
res.json(group);
});
};
// TODO add user to the group
// TODO clear all users from the group

View File

@@ -0,0 +1,19 @@
'use strict';
var mongoose = require('mongoose'),
Permission = mongoose.model('Permission');
exports.add_group = function(req, res) {
var new_group = new Permission(req.body);
new_group.save(function(err, group) {
if (err) {
res.send(err);
}
res.json(group);
});
};
// TODO add permisson to a user or a group
// TODO clear all permissions directly associated with a user or group

View File

@@ -0,0 +1,58 @@
'use strict';
var mongoose = require('mongoose'),
User = mongoose.model('User');
exports.list_all = function(req, res) {
User.find({}, function(err, user) {
if (err) {
res.send(err);
}
res.json(user);
});
};
exports.add_user = function(req, res) {
var new_user = new User(req.body);
new_user.save(function(err, user) {
if (err) {
res.send(err);
}
res.json(user);
});
};
exports.get_user = function(req, res) {
User.findById(req.params.userId, function(err, user) {
if (err) {
res.send(err);
}
res.json(user);
});
};
// TODO modify to update user permitions
exports.update_user = function(req, res) {
User.findOneAndUpdate({_id: req.params.userId}, req.body, {new: true}, function(err, user) {
if (err) {
res.send(err);
}
res.json(user);
});
};
// TODO modify to remove user permitions / group
exports.remove_user = function(req, res) {
User.remove({
_id: req.params.userId
}, function(err, user) {
if (err) {
res.send(err);
}
res.json({ message: 'User successfully deleted' });
});
};
// where should you place this:
// TODO for testing if a particular user has a particular permission over a particular object
// TODO for querying what permissions a particular user has over a particular object

19
api/models/groupModel.js Normal file
View File

@@ -0,0 +1,19 @@
'use strict';
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var permissonsSchema
var groupSchema = new Schema({
// TODO additional fields may be added
name: {
type: String
},
// TODO figure out those two below
permissons:[],
users: []
});
module.exports = mongoose.model('Group', groupSchema);

View File

@@ -0,0 +1,11 @@
'use strict';
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var permissionSchema = new Schema({
// TODO additional fields may be added
name: String,
});
module.exports = mongoose.model('Permission', permissionSchema);

16
api/models/userModel.js Normal file
View File

@@ -0,0 +1,16 @@
'use strict';
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var userSchema = new Schema({
// TODO additional fields may be added
username: String,
email: String,
Created_date: {
type: Date,
default: Date.now
}
});
module.exports = mongoose.model('User', userSchema);

21
api/routes/userRoutes.js Normal file
View File

@@ -0,0 +1,21 @@
'use strict';
module.exports = function(app) {
var group = require('../controllers/groupController');
var permission = require('../controllers/permissionController');
var user = require('../controllers/userController');
app.route('/group')
.get(group.list_all)
.post(group.add_group);
// TODO User Routes
app.route('/users')
.get(user.list_all)
.post(user.add_user);
app.route('/users/:userId')
.get(user.get_user)
.put(user.update_user)
.delete(user.remove_user);
};

55
db.json Normal file
View File

@@ -0,0 +1,55 @@
{
"objects": [
{
"id": 234,
"name": "someObject"
},
{
"id": 345,
"name": "someOtherObject"
}
],
"group": {
"id": 123,
"name": "administrators",
"permissions": [
{
"someObject": [
{
"view": true,
"modify": true
}
]
},
{
"someOtherObject": [
{
"view": true,
"modify": false
}
]
}
],
"users": [
321
]
},
"users": [
{
"id": 321,
"username": "Amra",
"groups": [
123
],
"permissions": [
{
"someObject": [
{
"delete": true
}
]
}
]
}
]
}

102
db21.json Normal file
View File

@@ -0,0 +1,102 @@
{
"objects": [
{
"id": "1" ,
"name": "First Named Object",
"permissions": [
{
"view": [
{
"id": 1,
"username": "someone"
},
{
"id": 1,
"name": "Group One"
},
{
"id": 2,
"name": "Group Two"
}
],
"modify": [
{
"id": 1,
"username": "someone"
},
{
"id": 2,
"name": "Group Two"
}
]
}
]
},{
"id": 2,
"name": "Second Named Object",
"permissions": [
{
"view": false,
"modify": false
}
]
},{
"id": 3,
"name": "Third Named Object",
"permissions": [
{
"view": true,
"modify": false
}
]
}
],
"groups": [
{
"id": 1,
"name": "Group One",
"users": [
{
"id": 1,
"username": "admin",
"permissions":[
{
"view": true,
"modify": true
}
]
},{
"id": 2,
"username": "someone"
},{
"id": 3,
"username": "somebody"
}
]
},{
"id": 2,
"name": "Group Two",
"users": [
{
"id": 1,
"username": "admin"
}
]
},{
"id": 3,
"name": "Group Three",
"users": [
{
"id": 5,
"username": "someoneNew"
},{
"id": 2,
"username": "someone"
},{
"id": 4,
"username": "somebodyNew"
}
]
}
]
}

4545
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

28
package.json Normal file
View File

@@ -0,0 +1,28 @@
{
"name": "json-based-api",
"version": "1.0.0",
"description": "API for managing a list of user and associated permissions",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon server.js"
},
"repository": {
"type": "git",
"url": "git+https://github.com/senaduka/amras-zadatak1.git"
},
"author": "Amra S",
"license": "ISC",
"bugs": {
"url": "https://github.com/senaduka/amras-zadatak1/issues"
},
"homepage": "https://github.com/senaduka/amras-zadatak1#readme",
"devDependencies": {
"json-server": "^0.12.1",
"nodemon": "^1.15.0"
},
"dependencies": {
"express": "^4.16.2",
"mongoose": "^5.0.6"
}
}

32
server.js Normal file
View File

@@ -0,0 +1,32 @@
// var express = require('express'),
// app = express(),
// port = process.env.PORT || 3000,
// mongoose = require('mongoose'),
// Group = require('./api/models/groupModel'),
// Permission = require('./api/models/permissionModel'),
// User = require('./api/models/userModel'), //created model loading here
// bodyParser = require('body-parser');
// // mongoose instance connection url connection
// mongoose.Promise = global.Promise;
// mongoose.connect('mongodb://localhost/Userdb');
// app.use(bodyParser.urlencoded({ extended: true }));
// app.use(bodyParser.json());
// var routes = require('./api/routes/userRoutes'); //importing route
// routes(app); //register the route
// app.listen(port);
// console.log('API server started on: ' + port);
const jsonServer = require('json-server');
const server = jsonServer.create();
const router = jsonServer.router('db.json');
const middlewares = jsonServer.defaults();
server.use(middlewares);
server.use(router);
server.listen(3000, () => {
console.log('JSON Server is running');
});