Files
desktop-app/node_modules/user.js

378 lines
9.2 KiB
JavaScript

var Evt = require('evt');
var db = require('db');
var fs = require('fs');
var Common = require('common');
function log(o) {
console.log(o);
}
/**
UserId (主键)
Email
Username
Token
LastLoginTime
IsActive // 是否是活跃用户
*/
// var User = {}
var Api = null; // require('api');
// 用户基本信息
User = {
token: '',
userId: '',
email: '',
username: '',
host: '', // 服务
LastSyncUsn: -1,
LastSyncTime: null,
// add local account support flag
// see https://github.com/leanote/desktop-app/issues/36
local: null,
// 登录后保存当前
setCurUser: function(user) {
var me = this;
if(user) {
this.token = user.Token;
this.userId = user.UserId;
this.email = user.Email;
this.username = user.Username;
this.host = user.Host; // http://leanote.com, http://localhost
this.local = user.IsLocal;
// 保存到数据库中
this.saveCurUser(user);
// 判断当前用户是否有文件夹
me.setUserDataPath();
}
},
// 登录
login: function(username, password, host, callback) {
var me = this;
// 先本地验证
db.users.findOne({Username: username, IsLocal: true}, function(err, user) {
if (!err && user && user.UserId && user.Pwd) {
var md5Password = Common.md5(password, user.UserId);
// 如果是32位的, 表示是md5
if (user.Pwd.length == 32) {
if (user.Pwd == md5Password) {
// 本地用户
me.saveCurUser(user, function() {
callback(true);
});
}
// 密码有误
else {
callback(false);
}
}
// 如果不是32位的, 那表示保存的是之前的明文, 则将明文转成密文
else if (user.Pwd == password) {
user.Pwd = md5Password;
me.saveCurUser(user, function() {
callback(true);
});
}
// 密码有误
else {
callback(false);
}
}
// 本地用户没有, 则远程验证
else {
if(!Api) {
Api = require('api');
}
// 远程验证
Api.auth(username, password, host, function(ret) {
if(ret.Ok) {
callback(true);
} else {
callback(false);
}
});
}
});
},
// 创建本地帐户
createLocalUser: function(useranme, pwd, callback) {
var me = this;
db.users.count({Username: useranme}, function(err, count) {
if(count == 0) {
var user = {};
user.Username = useranme;
user.IsLocal = true;
user.IsActive = true;
user.UserId = Common.objectId();
user.Pwd = Common.md5(pwd, user.UserId);
db.users.insert(user, function(err, doc) {
// 创建默认的笔记本
if (!err) {
// 设为当前user
me.saveCurUser(doc);
me.userId = user.UserId;
var Notebook = require('notebook');
var notebookId = Common.objectId();
Notebook.addNotebook(notebookId, 'Leanote', '', function (notebook) {
if (notebook) {
var Note = require('note');
var Tag = require('tag');
Tag.addOrUpdateTag('Leanote');
Tag.addOrUpdateTag('Welcome');
Note.updateNoteOrContent({
IsNew: true,
NoteId: Common.objectId(),
"NotebookId": notebookId,
"Title": "Welcome to Leanote 欢迎来到Leanote",
"Content": "<h2>Leanote, Not Just A NotePad!</h2>Welcome!<h2>Leanote, 不只是笔记</h2>欢迎!",
"Desc": "Leanote, Not Just A NotePad! Welcome",
"Tags": ['Leanote', 'Welcome']
}, function () {
callback(true);
});
}
else {
callback(true);
}
});
callback(true);
} else {
callback(false);
}
});
} else {
// log('save new user failed: username exists')
// log(err);
callback && callback(false, 'User exists');
}
});
},
// 不同host的userId可能一样, 潜在的bug
saveCurUser: function(user, callback) {
// 设置其它用户为 not active
db.users.update({_id: {$ne: user.UserId}}, {$set: {IsActive: false}}, {multi: true}, function(err, n) {
// 当前用户是否在数据库中
db.users.count({_id: user.UserId}, function(err, count) {
if(err || count == 0) {
// 添加一个
user['_id'] = user.UserId;
user['IsActive'] = true;
user['LastLoginTime'] = new Date();
db.users.insert(user, function(err, doc) {
callback && callback(true);
});
} else {
user.IsActive = true;
user.LastLoginTime = new Date();
delete user['Ok'];
db.users.update({_id: user.UserId}, {$set: user}, function(err, cnt) {
if(err || cnt == 0) {
callback && callback(false);
} else {
callback && callback(true);
}
});
}
});
});
},
// 打开软件时, 从db中获取当前用户
init: function(callback) {
console.log("......user init.......")
var me = this;
me.getG(function(g) {
me.g = g;
db.users.findOne({IsActive: true}, function(err, user) {
if(err || !user || !user.UserId) {
console.log('不存在');
callback && callback(false);
} else {
// me.setCurUser(doc);
me.token = user.Token;
me.userId = user.UserId;
me.email = user.Email;
me.username = user.Username;
me.LastSyncUsn = user.LastSyncUsn;
me.LastSyncTime = user.LastSyncTime;
me.host = user.Host;
me.local = user.IsLocal;
Evt.setHost(me.host);
// 全局配置也在user中, 到web端
for(var i in me.g) {
user[i] = me.g[i];
}
// 设置当前用户数据路径
me.setUserDataPath();
callback && callback(user);
}
});
});
},
// 得到当前活跃用户Id
getCurActiveUserId: function() {
return this.userId || "user1";
},
getToken: function() {
return this.token || "user1";
},
getCurUserImagesPath: function() {
return Evt.getBasePath() + '/' + this.getCurUserImagesAppPath();
},
getCurUserAttachsPath: function() {
return Evt.getBasePath() + '/' + this.getCurUserAttachsAppPath();
},
getCurUserImagesAppPath: function() {
return 'data/' + this.getCurActiveUserId() + '/images';
},
getCurUserAttachsAppPath: function() {
return 'data/' + this.getCurActiveUserId() + '/attachs';
},
setUserDataPath: function(userId) {
var me = this;
// 判断是否存在, 不存在则创建dir
try {
fs.mkdirSync(Evt.getBasePath() + '/data/');
}
catch(e) {};
try {
fs.mkdirSync(Evt.getBasePath() + '/data/' + this.getCurActiveUserId());
} catch(e) {
}
try {
fs.mkdirSync(Evt.getBasePath() + '/data/' + this.getCurActiveUserId() + '/images');
} catch(e) {
}
try {
fs.mkdirSync(Evt.getBasePath() + '/data/' + this.getCurActiveUserId() + '/attachs');
} catch(e) {
}
},
getCurUser: function(callback) {
var me = this;
db.users.findOne({_id: me.getCurActiveUserId()}, function(err, doc) {
if(err) {
callback(false);
} else {
callback(doc);
}
});
},
getLastSyncState: function(callback) {
var me = this;
me.getCurUser(function(user) {
if(user) {
callback(user.LastSyncUsn, user.LastSyncTime);
} else {
callback(false, false);
}
})
},
// 设为-1, 再刷新就会重新同步
fullSyncForce: function(callback) {
var me = this;
db.users.update({UserId: me.getCurActiveUserId()}, {$set: {LastSyncUsn: -1}}, function() {
callback && callback();
});
},
// 同步后更新同步状态
// pull 后调用
updateLastSyncState: function(callback) {
var me = this;
if(!Api) {
Api = require('api');
}
Api.getLastSyncState(function(state) {
if(state) {
// console.error('--updateLastSyncState---')
// console.log(state);
me.LastSyncUsn = state.LastSyncUsn;
me.LastSyncTime = state.LastSyncTime;
db.users.update({UserId: me.getCurActiveUserId()}, {$set: state});
}
callback();
});
},
isLocal: function() {
var me = this;
return me.local;
},
// send changes要用
getLastSyncUsn: function() {
var me = this;
return me.LastSyncUsn;
},
// 更新 send changes要用
updateLastSyncUsn: function(usn) {
var me = this;
me.LastSyncUsn = usn;
db.users.update({UserId: me.getCurActiveUserId()}, {$set: {LastSyncUsn: usn}});
},
// 全局配置
getG: function(callback) {
var me = this;
db.g.findOne({_id: '1'}, function(err, doc) {
if(err || !doc) {
callback({});
} else {
callback(doc);
}
});
},
// data = {Theme, NotebookWidth, NoteListWidth, MdEditorWidth, Version};
updateG: function(data, callback) {
db.g.update({_id: '1'}, {$set: data}, {upsert: true}, function() {
callback && callback();
});
},
/**
* [saveCurState description]
* @param {[type]} state [description]
* @return {[type]} [description]
User.saveCurState({
StarredOpened: StarredOpened,
NotebookOpened: NotebookOpened,
TagOpened: TagOpened,
CurNoteId: CurNoteId,
CurIsStarred: CurIsStarred,
CurNotebookId: CurNotebookId,
CurTag: CurTag
}, callback);
*/
saveCurState: function(state, callback) {
var me = this;
state = state || {};
db.users.update({_id: me.getCurActiveUserId()}, {$set: {State: state}}, function() {
callback && callback();
});
},
// 获取所有用户, 当前active的在第一个
getAllUsers: function(callback) {
db.users.find({}).sort({'LastLoginTime': -1}).exec(function(err, users) {
if(err) {
return callback && callback(false);
}
return callback && callback(users);
});
}
};
module.exports = User;