hopjs
Version:
A RESTful declarative API framework, with stub generators for Shell, and Android
149 lines (110 loc) • 5.42 kB
JavaScript
Hop = require('../../index');
Okapi = require('okapi');
dialect = require('./db');
crypto = require('crypto');
Okapi.log=true;
UserDAO = require('./user').UserDAO;
var TaskDAO = new Okapi.Object(dialect,"tasks");
TaskDAO.column("id", {type: Okapi.ID });
TaskDAO.column("title",{ type: Okapi.String });
TaskDAO.column("description", { type: Okapi.String });
TaskDAO.column("createdBy", { type: Okapi.IDRef, ref:{ dao: UserDAO, column:"id" }});
TaskDAO.column("assignedTo", { type: Okapi.IDRef, ref:{ dao: UserDAO, column:"id" }});
//FIXME make this take no lambda
TaskDAO.createTable().done(function(err){ console.log(err) });
Hop.defineModel("Task",function(user){
user.field("id", "TaskID","The user ID").integer().ID();
user.field("title","Title","Task Title").string();
user.field("description","Description","Task Description").string();
user.field("createdBy","Created By","Created by").integer().ID();
user.field("assignedTo","Assigned To","Assigned to").integer().ID();
});
Task={};
Task.create=function(input,onComplete,request){
input.createdBy = request.session.user.id;
TaskDAO.insert(input).done(function(err,task){
if(err) return onComplete(Hop.DAOError("Unable to create task",err));
return onComplete(null,new Hop.href("Task.read",{id: task.id }));
});
}
Task.read=function(input,onComplete){
TaskDAO.find({id: input.id }).first(function(err,task){
if(err) return onComplete(Hop.DAOError("Unable to read task",err));
if(task){
var assignedTo = task.assignedTo*1;
var createdBy = task.createdBy*1;
//task.assignedTo = { href: new Hop.href("User.read",{id: assignedTo }) }
//task.createdBy = { href: new Hop.href("User.read", {id: createdBy }) }
task.assignedTo= { href: new Hop.href("User.read",{id:assignedTo}), id: assignedTo }
task.createdBy= { href: new Hop.href("User.read",{id:createdBy}), id: createdBy }
return onComplete(null, task);
} else return onComplete(null,null);
});
}
Task.update=function(input,onComplete){
//FIXME need to pull an ID from the task
TaskDAO.update(input).done(function(err,task){
if(err) return onComplete(Hop.DAOError("Unable to update task",err));
task.assignedTo = new Hop.href("User.read",{id:task.assignedTo});
task.createdBy = new Hop.href("User.read",{id:task.createdBy});
return onComplete(null,task);
});
}
Task.delete=function(input,onComplete){
TaskDAO.delete(input).done(function(err,res){
if(err) return onComplete(Hop.DAOError("Unable to delete tasks",err));
return onComplete(null,true);
});
}
Task.list=function(input,onComplete){
//FIXME add offset & limit
TaskDAO.find().limit(input.limit).offset(input.offset).orderBy("id","asc").done(function(err,tasks){
if(err) return onComplete(Hop.DAOError("Unable to list tasks",err));
tasks.forEach(function(task){
task.href = new Hop.href("Task.read", { id: task.id });
task.assignedTo= { href: new Hop.href("User.read",{id:task.assignedTo}), id: task.assignedTo }
task.createdBy= { href: new Hop.href("User.read",{id:task.createdBy}), id: task.createdBy }
});
return onComplete(err,{ items: tasks });
});
}
Hop.defineClass("Task",Task,function(api){
api.create("create","/tasks").demands("title","description","assignedTo").requireUser();
api.read("read","/tasks/:id").requireUser();
api.update("update","/tasks/:id").requireUser();
api.del("delete","/tasks/:id").requireUser();
api.list("list","/tasks/").requireUser();
});
Hop.defineTestCase("Task.list",function(test){
var user1 = { email:"test1@test.com", password:"password"};
var user2 = { email:"test2@test.com", password:"password"};
var validTask = { title: "Test Task", description:"Description", assignedTo:1 };
test.do("User.create").with(user1).noError();
test.do("User.login").with(user1).noError();
test.do("User.current").with().noError().saveOutputAs("user1");
for(var i = 0;i<100;i++){
test.do("Task.create").with(validTask, {expand:true }).noError().saveOutputAs("savedTask"+i);
}
test.do("Task.list").with().noError().arrayContains("items","savedTask1");
test.do("Task.list").with({offset:50}).noError().arrayContains("items","savedTask52");
for(var i = 0;i<100;i++){
test.do("Task.delete").with("savedTask"+i).noError();
}
test.do("User.delete").with("user1").noError();
test.do("User.logout").with().noError();
});
Hop.defineTestCase("Task.create",function(test){
var user1 = { email:"test1@test.com", password:"password"};
var user2 = { email:"test2@test.com", password:"password"};
var validTask = { title: "Test Task", description:"Description", assignedTo:1 };
test.do("User.create").with(user1).noError();
test.do("User.login").with(user1).noError();
test.do("User.current").with().noError().saveOutputAs("user1");
test.do("Task.create").with(validTask).noError().saveOutputAs("savedTask").outputHasProperty("href");
test.do("Task.read").with("savedTask").noError();
test.do("Task.read").with("savedTask",{expand:"createdBy"}).noError().outputHasProperty("createdBy","user1");
test.do("Task.read").with("savedTask",{expand:["assignedTo","createdBy"]}).noError().outputHasProperty("createdBy","user1");
test.do("Task.delete").with("savedTask").noError();
test.do("User.delete").with("user1").noError();
test.do("User.logout").with().noError();
});