var db = require('db'); var async = require('async'); var User = require('user'); var Note = require('note'); var Notebook = require('notebook'); var Common = require('common'); var Tags = db.tags; var needle = require('needle'); var fs = require('fs'); function log(o) { console.log(o); } // log(Common); // log(db); // log("??") // 远程数据服务 var Api = { leanoteUrl: 'http://localhost:9000', baseUrl: 'http://localhost:9000/api', getUrl: function(url, param) { if(!User) { } var url = this.baseUrl + '/' + url; var token = User.getToken(); param = param || {}; param.token = token; if(param) { var paramStr = ''; for(var i in param) { paramStr += i + '=' + param[i] + '&'; } } if(url.indexOf('?') >= 0) { return url + '&' + paramStr; } return url + '?' + paramStr; }, // 登录 auth: function(email, pwd, callback) { var me = this; // log({emai: email, pwd: pwd}); // log(this.getUrl('auth/login', {email: email, pwd: pwd})); needle.get(this.getUrl('auth/login', {email: email, pwd: pwd}), function(error, response) { if(error) { return callback && callback(false); } // needle.get('http://localhost/phpinfo.php?email=xx', {emai: email, pwd: pwd}, function(error, response) { var ret = response.body; // 登录成功, 保存token // log('login ret'); // log(ret); if(Common.isOk(ret)) { ret.Pwd = pwd; User.setCurUser(ret); callback && callback(ret); } else { log('log failed'); callback && callback(false); } }); }, post: function() { var me = this; var options = { headers: { 'X-Custom-Header': 'Bumbaway atuna' } } // you can pass params as a string or as an object. needle.post(me.getUrl('auth/login'), 'foo=bar', options, function(err, resp) { var ret = resp.body; log(ret); }); }, // get图片 getImageTest: function(callback) { needle.get('http://localhost:9000/images/logo.png', function(err, resp) { // log(resp.body); /* { 'accept-ranges': 'bytes', 'content-disposition': 'inline; filename="logo.png"', 'content-length': '8583', 'content-type': 'image/png', date: 'Mon, 19 Jan 2015 15:01:47 GMT', */ // log(resp.headers); fs.writeFile('/Users/life/Desktop/aa.png', resp.body); }); }, // 测试 uploadImage: function() { var data = { foo: 'bar', cc: [1,2,3,3], dd: {name: 'life', age: 18}, image: { file: '/Users/life/Desktop/imageplus.png', content_type: 'image/png' } } needle.post('http://localhost/phpinfo.php', data, { multipart: true }, function(err, resp, body) { // needle will read the file and include it in the form-data as binary console.log(resp.body); }); }, getSyncNotebooks: function(afterUsn, maxEntry, callback) { var me = this; var url = this.getUrl('notebook/getSyncNotebooks', {afterUsn: afterUsn, maxEntry: maxEntry}); needle.get(url, function(error, response) { if(error) { return callback && callback(false); } var ret = response.body; log(ret); log(Common); if(Common.isOk(ret)) { callback && callback(ret); } else { callback && callback(false); } }); }, getSyncNotes: function(afterUsn, maxEntry, callback) { var me = this; var url = this.getUrl('note/getSyncNotes', {afterUsn: afterUsn, maxEntry: maxEntry}); log(url); needle.get(url, function(error, response) { if(error) { console.log('note/getSyncNotes'); console.log(error); return callback && callback(false); } var ret = response.body; if(Common.isOk(ret)) { callback && callback(ret); } else { callback && callback(false); } }); }, getSyncTags: function(afterUsn, maxEntry, callback) { var me = this; var url = this.getUrl('tag/getSyncTags', {afterUsn: afterUsn, maxEntry: maxEntry}); log(url); needle.get(url, function(error, response) { if(error) { console.log('tag/getSyncTags'); console.log(error); return callback && callback(false); } var ret = response.body; console.log(ret); if(Common.isOk(ret)) { callback && callback(ret); } else { callback && callback(false); } }); }, getLastSyncState: function(callback) { var me = this; log('--getSyncState--') var url = this.getUrl('user/getSyncState'); log(url); needle.get(url, function(error, response) { if(error) { return callback && callback(false); } var ret = response.body; log('--getSyncState--ret---') log(ret); if(Common.isOk(ret)) { callback && callback(ret); } else { callback && callback(false); } }); }, // 获取笔记内容, 获取之后保存到笔记中 getNoteContent: function(noteId, callback) { var me = this; var url = this.getUrl('note/getNoteContent', {noteId: noteId}); log(url); needle.get(url, function(error, response) { if(error) { log(error); return callback && callback(false); } var ret = response.body; log('--------') log(ret); if(Common.isOk(ret)) { // {Content: 'xx', NoteId: 'xxx'} // Note.updateNoteContentForce(noteId, ret.Content, function() { callback && callback(ret); // }); } else { callback && callback(false); } }); }, // TODO // get图片, 获取内容后, 得到所有图片链接, 异步去获取图片, 并修改图片链接, // 将https://leanote.com/api/resource/getImage?imageId=xx // 转成app://leanote/public/files, 内部可以是个服务器吗? 请求内部的controller getImage: function(fileId, callback) { var me = this; var url = me.getUrl('file/getImage', {fileId: fileId}); log(url); needle.get(url, function(err, resp) { if(err) { return callback && callback(false); } // log(resp.body); /* { 'accept-ranges': 'bytes', 'content-disposition': 'inline; filename="logo.png"', 'content-length': '8583', 'content-type': 'image/png', date: 'Mon, 19 Jan 2015 15:01:47 GMT', */ // log(resp.headers); if(err) { callback(false); } else { var typeStr = resp.headers['content-type']; log(resp.headers); log(typeStr); var type = 'png'; if(typeStr) { var typeArr = typeStr.split('/'); if(typeStr.length > 1) { type = typeArr[1]; } } var filename = Common.uuid() + '.' + type; var imagePath = User.getCurUserImagesPath(); var imagePathAll = imagePath + '/' + filename; log(imagePathAll); fs.writeFile(imagePathAll, resp.body, function(err) { if(err) { log(err); log('local save image failed 本地保存失败'); callback(false); } else { callback(imagePathAll, filename); } }); } }); }, //------------ // 笔记本操作 //------------ // 添加 addNotebook: function(notebook, callback) { var me = this; // notebook.ParentNotebookId是本的, 要得到远程的 Notebook.getServerNotebookIdByNotebookId(notebook.ParentNotebookId, function(serverNotebookId) { var data = { title: notebook.Title, seq: notebook.Seq, parentNotebookId: serverNotebookId } log('add notebook'); log(data); needle.post(me.getUrl('notebook/addNotebook'), data, {}, function(err, resp) { if(err) { return callback(false); } var ret = resp.body; log(ret); if(Common.isOk(ret)) { callback(ret); } else { callback(false); } }); }); }, // 更新 updateNotebook: function(notebook, callback) { var me = this; Notebook.getServerNotebookIdByNotebookId(notebook.ParentNotebookId, function(serverNotebookId) { var data = { notebookId: notebook.ServerNotebookId, title: notebook.Title, usn: notebook.Usn, seq: notebook.Seq, parentNotebookId: serverNotebookId || "" } log('update notebook'); log(data); needle.post(me.getUrl('notebook/updateNotebook'), data, {}, function(err, resp) { if(err) { log('err'); log(err); return callback(false); } var ret = resp.body; log('update notebook ret:'); log(ret); if(Common.isOk(ret)) { callback(ret); } else { callback(false); } }); }); }, // 删除 deleteNotebook: function(notebook, callback) { var me = this; var data = {notebookId: notebook.ServerNotebookId, usn: notebook.Usn}; log('delete notebook'); needle.post(me.getUrl('notebook/deleteNotebook'), data, {}, function(err, resp) { if(err) { return callback(false); } var ret = resp.body; log('delete notebook ret'); log(ret); if(Common.isOk(ret)) { // 以后不要再发了 Notebook.setNotDirty(notebook.NotebookId); callback(ret); } else { callback(false); try { log('delete notebook conflict'); // 代表冲突了, 那么本地的删除无效, 设为IsDirty为false, 不删除 // 待以后同步 if(ret.Msg == 'conflict') { log('delete notebook conflict: setNotDirtyNotDelete'); Notebook.setNotDirtyNotDelete(notebook.NotebookId); } else { log('delete notebook conflict: setNotDirty'); Notebook.setNotDirty(notebook.NotebookId); } } catch(e) {} } }); }, //--------- // note //-------- // 获取笔记 // noteId是serverNoteId getNote: function(noteId, callback) { needle.get(this.getUrl('note/getNote', {NoteId: noteId}), function(error, response) { if(error) { return callback && callback(false); } var ret = response.body; if(Common.isOk(ret)) { callback && callback(ret); } else { log(error); callback && callback(false); } }); }, // 添加笔记 // 要把文件也发送过去 addNote: function(note, callback) { var me = this; // note.NotebookId是本的, 要得到远程的 Notebook.getServerNotebookIdByNotebookId(note.NotebookId, function(serverNotebookId) { var data = { Title: note.Title, NotebookId: serverNotebookId, Content: note.Content, IsMarkdown: note.isMarkdown, Tags: note.Tags, IsBlog: note.IsBlog, Files: note.Files, FileDatas: note.FileDatas } // log('add note'); // log(data); // files处理 var needMultiple = false; for(var i in data.FileDatas) { needMultiple = true; break; } // 最终传递的数据 console.log('end transfer data'); console.log(data); try { needle.post(me.getUrl('note/addNote'), data, {multipart: needMultiple}, function(err, resp) { if(err) { return callback(false); } var ret = resp.body; log('add note ret'); log(ret); log('add note ret<-'); if(Common.isOk(ret)) { // 将serverId保存 callback(ret); } else { callback(false); } }); } catch(e) {}; }); }, // 更新 updateNote: function(note, callback) { var me = this; Notebook.getServerNotebookIdByNotebookId(note.NotebookId, function(serverNotebookId) { var data = { noteId: note.ServerNoteId, notebookId: serverNotebookId || "", title: note.Title, usn: note.Usn, isTrash: note.IsTrash, content: note.Content, Files: note.Files, FileDatas: note.FileDatas } console.log('update note :'); console.log(data); // files处理 var needMultiple = false; for(var i in data.FileDatas) { needMultiple = true; break; } needle.post(me.getUrl('note/updateNote'), data, {multipart: needMultiple}, function(err, resp) { if(err) { log('err'); log(err); return callback(false); } var ret = resp.body; log('update note ret:'); log(ret); callback(ret); /* if(Common.isOk(ret)) { } else { callback(false); } */ }); }); }, // 删除 deleteTrash: function(note, callback) { var me = this; var data = {noteId: note.ServerNoteId, usn: note.Usn}; log('delete note'); // 这里要重新require下, 不然为{} Note = require('note'); needle.post(me.getUrl('note/deleteTrash'), data, {}, function(err, resp) { if(err) { return callback(false); } var ret = resp.body; log('delete note ret'); log(ret); if(Common.isOk(ret)) { // 以后不要再发了 Note.setNotDirty(note.NoteId); callback(ret); } else { callback(false); try { log('delete note conflict'); // 代表冲突了, 那么本地的删除无效, 设为IsDirty为false, 不删除 // 待以后同步 if(ret.Msg == 'conflict') { log('delete note conflict: setNotDirtyNotDelete'); Note.setNotDirtyNotDelete(note.NoteId); } else { log('delete note conflict: setNotDirty'); Note.setNotDirty(note.NoteId); } } catch(e) {} } }); }, test: function() { log("??"); Note = require('note'); log(Note); } }; module.exports = Api;