diff --git a/lib/boards-api.js b/lib/boards-api.js index 73d0b59..7661ba9 100644 --- a/lib/boards-api.js +++ b/lib/boards-api.js @@ -5,9 +5,9 @@ function asObj(str,done){ try { obj = JSON.parse(str) } catch (e) { - done(e,null) + return done(e,null) } - if(obj != undefined) done(null,obj) + done(null,obj) } function replyAsObj(res,isJson,done){ @@ -38,23 +38,61 @@ function replyAsObj(res,isJson,done){ function BoardsAPI(ipfs){ this.ipfs = ipfs this.version = 'dev' + this.users = {} } -BoardsAPI.prototype.searchUsers = function(done){ +// This function works but needs a little rethinking. +BoardsAPI.prototype.resolveIPNS = function(n,done){ + var cached = this.users[n] + if(cached){ + done(null,cached) + } + this.ipfs.name.resolve(n,(err,r) => { + console.log('Resolved',n,'to',r) + if(err){ + done(err) + } else if(!cached){ + done(err,r.Path) + } else if(cached !== r.Path){ + // Update cache + this.users[n] = r.Path + } + }) +} + +BoardsAPI.prototype.isUserProfile = function(addr,done){ + this.ipfs.cat(addr+'/ipfs-boards-version.txt',(err,r) => { + if(err) return done(false) + replyAsObj(r,false,(_,res) => { + var v = res.trim() + console.log('Version for',addr,'is',v) + done(v) + }) + }) +} + +BoardsAPI.prototype.isUser = function(s){ + var ss = s.split('/') + var addr = ss[ss.length-1] + // Try to see if they run IPFS Boards + console.log('Is',addr,'a user?') + this.resolveIPNS(addr,(err,url) => { + if(err) return console.log('Cannot resolve',addr,':',err) + this.isUserProfile(url,isit => { + if(isit == this.version){ + console.log(addr,'is a user') + this.users[addr] = url + } + }) + }) +} + +BoardsAPI.prototype.searchUsers = function(){ // Look at our peers - this.ipfs.swarm.peers(function(err,r){ - var peers = r.Strings.forEach(function(s){ - var ss = s.split('/') - var addr = ss[ss.length-1] - // Try to see if they run IPFS Boards - this.ipfs.cat(addr+'/ipfs-boards-version.txt',function(err,r){ - if(err) return console.log('Search Err:',err) - replyAsObj(r,false,(_,res) => { - // He does! - // TODO: store found users in a list? - console.log('Found user:',addr,'using version',res) - }) - }) + this.ipfs.swarm.peers((err,r) => { + if(err) return console.log(err) + replyAsObj(r,true,(e,reply) => { + reply.Strings.forEach(this.isUser.bind(this)) }) }) } @@ -81,7 +119,9 @@ BoardsAPI.prototype.getName = function(userID,done){ BoardsAPI.prototype.getBoardSettings = function(userID,board,done){ var url = userID+'/boards/'+board+'/settings.json' + console.log("Getting Board Settings:",url) this.ipfs.cat(url,function(err,res){ + console.log('Done') if(err){ done(err,{}) } else { @@ -90,27 +130,27 @@ BoardsAPI.prototype.getBoardSettings = function(userID,board,done){ }) } -BoardsAPI.prototype.getBoardPosts(board,administratorID,done){ +BoardsAPI.prototype.getBoardPosts = function(board,administratorID,done){ // Returns a stream } -BoardsAPI.prototype.getUserPosts(user,board,done){ +BoardsAPI.prototype.getUserPosts = function(user,board,done){ // Returns a stream } -BoardsAPI.prototype.getComments(parent,board,done){ +BoardsAPI.prototype.getComments = function(parent,board,done){ // Returns a stream } -BoardsAPI.prototype.createPost(post,board,done){ +BoardsAPI.prototype.createPost = function(post,board,done){ } -BoardsAPI.prototype.createComment(parent,comment,done){ +BoardsAPI.prototype.createComment = function(parent,comment,done){ } -BoardsAPI.prototype.createUpvote(parent,done){ +BoardsAPI.prototype.createUpvote = function(parent,done){ } @@ -125,6 +165,7 @@ BoardsAPI.prototype.init = function(done){ } else { console.log('I am',res.ID) this.id = res.ID + this.isUser(res.ID) console.log('Version is',this.version) this.ipfs.add(new Buffer('ipfs:boards:version:'+this.version),(err,r) => { this.version_hash = r[0].Hash diff --git a/server/server.js b/server/server.js index 0e95bea..5fa9289 100755 --- a/server/server.js +++ b/server/server.js @@ -10,8 +10,40 @@ var boards = new BoardsAPI(ipfs) // Serve web app app.use(express.static('../webapp')) +// Generates a callback function to pass the API response to HTTP +var apiToHandler = function(request,response){ + return (function(a,b){ + var req = a + var res = b + return function(err,r){ + if(err){ + res.status(500) + res.send(err) + } else { + if(r.split){ + res.send(r) + } else { + res.json(r) + } + } + } + })(request,response) +} + // Create gateways to access the BoardsAPI +app.get('/@:user',(req,res) => { + boards.getProfile(req.params.user,apiToHandler(req,res)) +}) + +app.get('/@:user/:board',(req,res) => { + boards.getBoardSettings(req.params.user,req.params.board,apiToHandler(req,res)) +}) + +//boards.searchUsers() + +// Start the web server + function startWebServer(){ // Start http server app.listen(3000,function(){