Compare commits
18 Commits
master
...
developmen
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
17f8746703 | ||
|
|
9174647b67 | ||
|
|
07bfc615bf | ||
|
|
61389a98f7 | ||
|
|
419993262d | ||
|
|
36a4fb4272 | ||
|
|
ce90f496d1 | ||
|
|
2362d417d6 | ||
|
|
4d47c08182 | ||
|
|
a51eb8cb0a | ||
|
|
283634765b | ||
|
|
ad6ffd0d89 | ||
|
|
fda840d119 | ||
|
|
e51d046374 | ||
|
|
14f42b113e | ||
|
|
8c7cfb08da | ||
|
|
3e0f41ef26 | ||
|
|
f75bf59ef3 |
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
# Dependency directories
|
||||
node_modules
|
||||
|
||||
# Editor
|
||||
.idea
|
||||
18
README.md
18
README.md
@@ -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.
|
||||
|
||||
28
api/controllers/groupController.js
Normal file
28
api/controllers/groupController.js
Normal 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
|
||||
19
api/controllers/permissionController.js
Normal file
19
api/controllers/permissionController.js
Normal 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
|
||||
58
api/controllers/userController.js
Normal file
58
api/controllers/userController.js
Normal 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
19
api/models/groupModel.js
Normal 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);
|
||||
11
api/models/permissionModel.js
Normal file
11
api/models/permissionModel.js
Normal 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
16
api/models/userModel.js
Normal 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
21
api/routes/userRoutes.js
Normal 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
55
db.json
Normal 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
102
db21.json
Normal 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
4545
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
28
package.json
Normal file
28
package.json
Normal 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
32
server.js
Normal 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');
|
||||
});
|
||||
Reference in New Issue
Block a user