Skip to content

Commit 0ac12aa

Browse files
committed
in memory server to stub behaviors
1 parent 4694aca commit 0ac12aa

File tree

6 files changed

+177
-0
lines changed

6 files changed

+177
-0
lines changed

server/.nvmrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
iojs-v2.4.0

server/auth.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
var User = require("./models").User;
2+
3+
var renderAccount = function (user) {
4+
var out = {
5+
id: user.id,
6+
token: user.token
7+
};
8+
return out;
9+
};
10+
11+
exports.loginUser = function *() {
12+
var params = this.request.body || {};
13+
var username = (params.username || "").trim();
14+
var password = (params.password || "").trim();
15+
16+
if(!username) this.throw("No username provided", 422);
17+
if(!password) this.throw("No password provided", 422);
18+
19+
var user = User.findByUsername(username);
20+
if (user && user.authenticate(password)) {
21+
this.status = 200;
22+
this.body = renderAccount(user);
23+
}
24+
else {
25+
this.status = 422;
26+
this.body = {error: "Username and password not found"}
27+
}
28+
};
29+
30+
exports.getCurrentUser = function *() {
31+
this.status = 200;
32+
this.body = renderAccount(this.passport.user);
33+
};
34+
35+
exports.createUser = function *() {
36+
var params = this.request.body || {};
37+
var username = (params.username || "").trim();
38+
var password = (params.password || "").trim();
39+
40+
if(!username) this.throw("No username provided", 422);
41+
if(!password) this.throw("No password provided", 422);
42+
43+
var user = User.findByUsername(username);
44+
if(user) this.throw("User already exists", 422);
45+
46+
user = User.create(params.username, params.password);
47+
48+
this.status = 201;
49+
this.body = renderAccount(user);
50+
};

server/models.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// in memory database for testing
2+
3+
var _users = {}
4+
var _usersCount = 0;
5+
var User = function(username) {
6+
this.id = ++_usersCount;
7+
this.username = username;
8+
this.password = null;
9+
};
10+
11+
User.findByUsername = function(username) {
12+
for(var id in _users) {
13+
if (_users[id].username === username) {
14+
return _users[id];
15+
}
16+
}
17+
return null;
18+
};
19+
20+
User.findByToken = function(token) {
21+
for(var id in _users) {
22+
if (_users[id].token === token) {
23+
return _users[id];
24+
}
25+
}
26+
return null;
27+
};
28+
29+
User.create = function(username, password) {
30+
var user = new User(username);
31+
user.password = password;
32+
user.token = Math.random().toString(36).substr(2);
33+
_users[user.id] = user;
34+
return user;
35+
};
36+
37+
User.prototype.authenticate = function(password) {
38+
return this.password === password;
39+
};
40+
41+
// Seed some people
42+
User.create('bleonard', 'sample');
43+
User.create('jrlai', 'sample');
44+
45+
46+
exports.User = User;

server/package.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"name": "server",
3+
"version": "0.0.1",
4+
"private": true,
5+
"scripts": {
6+
"start": "node --harmony server.js"
7+
},
8+
"dependencies": {
9+
"koa": "^1.0.0",
10+
"koa-bodyparser": "^2.0.1",
11+
"koa-error": "^1.1.3",
12+
"koa-passport": "^1.2.0",
13+
"koa-router": "^5.1.2",
14+
"passport": "^0.3.0",
15+
"passport-http-bearer": "^1.0.1",
16+
"password": "^0.1.1"
17+
}
18+
}

server/secured.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
var passport = require("koa-passport");
2+
var BearerStrategy = require('passport-http-bearer').Strategy;
3+
var User = require("./models").User;
4+
5+
passport.use(new BearerStrategy({},
6+
function(token, done) {
7+
user = User.findByToken(token);
8+
if (user) return done(null, user);
9+
else return done(null, false);
10+
}
11+
));
12+
13+
var secured = function *(next) {
14+
var _this = this;
15+
yield passport.authenticate("bearer", { session: false },
16+
function*(err, user, info) {
17+
if (err) {
18+
throw err;
19+
}
20+
else if (!user) {
21+
_this.status = 401;
22+
_this.body = {error: "Please log in"}
23+
}
24+
else {
25+
_this.passport.user = user;
26+
yield next;
27+
}
28+
});
29+
};
30+
31+
module.exports = secured;

server/server.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
"use strict";
2+
3+
const koa = require("koa");
4+
const errorHandler = require("koa-error");
5+
const bodyParser = require("koa-bodyparser");
6+
const Router = require("koa-router");
7+
8+
const app = module.exports = koa();
9+
app.use(errorHandler());
10+
app.use(bodyParser());
11+
12+
var router = new Router();
13+
14+
router.use(function *(next) {
15+
// everything json
16+
this.type = "json";
17+
this.headers['accept'] = "application/json";
18+
yield next;
19+
});
20+
21+
22+
var secured = require('./secured')
23+
var auth = require("./auth");
24+
25+
router.post("/api/signup", auth.createUser);
26+
router.post("/api/login", auth.loginUser);
27+
router.get ("/api/account", secured, auth.getCurrentUser);
28+
app.use(router.routes());
29+
30+
app.listen(3000);
31+
console.log("Server started, listening on port: 3000");

0 commit comments

Comments
 (0)