Merge pull request #13 from jysperm/mongodb-native-model

New Model
This commit is contained in:
精英王子
2014-02-19 17:04:50 +08:00
8 changed files with 122 additions and 128 deletions

View File

@@ -1,16 +1,23 @@
crypto = require 'crypto'
assert = require 'assert'
User = require './model/User'
exports.sha256 = (data) ->
return crypto.createHash('sha256').update(data).digest('hex');
exports.randomSalt = ->
return exports.sha256 crypto.randomBytes(256)
exports.hashPasswd = (passwd, passwd_salt) ->
return exports.sha256(exports.sha256(passwd) + passwd_salt)
exports.createToken = (user, attribute, callback = undefined) ->
generateToken = (callback) ->
token = exports.sha256 crypto.randomBytes(256)
token = exports.randomSalt()
User.findBy {'tokens.token': token}, (result) ->
if result.documents.length > 0
User.find {'tokens.token': token}, (err,result) ->
assert.equal null,err
if result.length > 0
generateToken callback
else
callback token
@@ -31,8 +38,9 @@ exports.authenticate = (token, callback) ->
if not token
callback true, null
User.findBy {'tokens.token': token}, (result) ->
if result.documents.length > 0
User.find {'tokens.token': token}, (err,result) ->
assert.equal null,err
if result.length > 0
callback undefined, result
else
callback true, null

View File

@@ -8,7 +8,7 @@ module.exports =
db:
type: 'mongo'
server: '/home/rpadmin/mongod.sock'
server: 'localhost'
name: 'RootPanel'
user: 'rpadmin'
passwd: 'passwd'
name: 'RootPanel'

12
core/db.coffee Normal file
View File

@@ -0,0 +1,12 @@
Db = (require 'mongodb').Db
Server = (require 'mongodb').Server
assert = require 'assert'
config = (require './config').db
# url = "mongodb://#{config.user}:#{config.passwd}@#{config.server}/#{config.name}"
url = "mongodb://127.0.0.1:27017/#{config.name}"
# MongoClient.connect url, {}, (err, db) ->
# assert.equal null,err
# module.exports = db
module.exports = new Db config.name, (new Server 'localhost',27017),safe : true

View File

@@ -1,62 +0,0 @@
$ = (require "mongous").Mongous
config = require "../config"
EventProxy = require 'eventproxy'
Tool = require '../tool'
class BaseModel
constructor : ->
@constructor.errors = {}
@constructor.ep = new EventProxy()
@constructor.searchBy = ''
@dbHandle : ->
$ "#{config.db.name}.#{@table()}"
save : (callback = Tool.nullFunc)->
# @constructor.resetErrors()
@validate (validated)=>
err = @constructor.errors
if validated
searchBy = @constructor.searchBy
@constructor.resetErrors()
@constructor.dbHandle().save @data
@constructor["findBy#{Tool.firstCapital searchBy}"] @data[searchBy],(r)=>
@data = r.documents[0]
callback(null,@data)
else
callback(err,null)
#如验证需重写
validate : (callback)->
@constructor.ep.once 'validate',callback
remove : ->
@constructor.dbHandle().remove _id: @data._id
update : (update,upsert = false, multi = true)->
@constructor.update {_id : @data._id},update,upsert,multi
@update : (what,update,upsert = false,multi = true) ->
@dbHandle().update what,update,upsert,multi
@findById : (id,callback) ->
@dbHandle().find 1,{_id : id},callback
@findBy : (obj,callback,num = 1) ->
@dbHandle().find num,obj,callback
@getErrors : ->
@errors
@resetErrors : ->
@errors = {}
@setErrors : (k,v)->
@errors[k] = v
required : (arr)->
@constructor.setErrors key, "#{key}不能为空" for key in arr when !@data[key]
exsited : (k,v)->
# for k, v of obj
temp = {}
temp[k] = v
@constructor.findBy temp,(r)=>
if r.documents.length isnt 0
@constructor.setErrors k, "#{k}已经存在"
@constructor.ep.emit "exsited_#{k}",false
@constructor.ep.emit "exsited_#{k}",true
module.exports = BaseModel

68
core/model/Model.coffee Normal file
View File

@@ -0,0 +1,68 @@
MongoClient = require('mongodb').MongoClient
ObjectID = require('mongodb').ObjectID;
_ = require 'underscore'
assert = require 'assert'
db = require '../db'
# db.open (err,db)->
# (db.collection 'users').find().toArray (err,result)->
# console.log result
module.exports = class Model
constructor: (@attributes,opts = {}) ->
@create : ->
throw 'this function must be overrided'
@table : ->
throw 'this function must be overrided'
@collection: (db)->
db.collection @table()
set : (key, value = null) ->
if (_.isObject key) is 'object' then attrs = key else attrs[key] = value
@attributes[k] = v for k, v of attrs
@
get : (attr)->
@attributes[attr]
save : (attributes,callback)->
db.open (err,db) =>
@collection(db).insert attributes,{},(err,docs) =>
assert.equal null,err
db.close()
if callback
results = []
if docs.length is 1
for doc in doc
results.push @create doc
else
results = @create docs[0]
callback err,results
@find : (attrs,opts = {},callback = null)->
if _.isFunction attrs
callback = attrs
attrs = {}
else if _.isFunction opts
callback = opts
opts = {}
db.open (err,db) =>
@collection(db).find(attrs,opts).toArray (err,docs)=>
assert.equal null,err
db.close()
if callback
results = []
if docs.length is 1
results = @create docs[0]
else
for doc in docs
results.push @create doc
callback err,results
@findById: (id, callback = null) ->
throw 'id must be string' if !_.isString id
db.open (err,db) =>
@collection().findOne {_id: new ObjectID id}, (err, result) =>
throw err if err
db.close()
result = @create result
if callback
callback err,result

View File

@@ -1,49 +1,26 @@
BaseModel = require "./BaseModel"
crypto = require "crypto"
Tool = require '../tool'
isEmptyObj = (obj)->
for key of obj
return false
true
class User extends BaseModel
constructor : (data = {name : null,email:null,passwd:null}) ->
super()
passwd_salt = crypto.createHash('sha256').digest('hex')
@data =
name : data.name or null
email : data.email or null
passwd_salt : passwd_salt
passwd : crypto.createHash('sha256').update(data.passwd+data.passwd_salt).digest('hex') if data.passwd
signup_at : Math.round Date.now()/1000
group : []
tokens : []
setting : {}
attribute : {}
@constructor.searchBy = 'name'
@table : ->
'users'
validate : (callback)->
super(callback)
@required ['name','passwd','email']
@constructor.ep.all 'exsited_name','exsited_email',(name,email)=>
@constructor.ep.emit 'validate', if name and email then true else false
@exsited 'name' ,@data.name
@exsited 'email', @data.email
# if isEmptyObj constructor.errors then false else true
@findByName: (name,callback,num = 1) ->
@dbHandle().find num,
name : name
,callback
addToGroup : (group) ->
if Tool.typeIsArray group
@update
'$addToSet' :
group :
'$each' : group
else
@update
'$addToSet' :
group : gourp
Model = require './Model'
auth = require '../auth'
assert = require 'assert'
db = require '../db'
_ = require 'underscore'
module.exports = class User extends Model
@create : (attrs,opts = {})->
return new User attrs,opts
@table : ->
'users'
module.exports = User
@register: (username, email, passwd, callback = null) ->
passwd_salt = auth.randomSalt()
attributes =
name: username
passwd: auth.hashPasswd(passwd, passwd_salt)
passwd_salt: passwd_salt
email: email
signup: new Date()
group: []
setting: {}
attribure: {}
tokens: []
@save attributes,callback

View File

@@ -1,9 +0,0 @@
Tool =
firstCapital : (str) ->
return str.replace /\b\w+\b/g,(word) ->
return word.substring(0,1).toUpperCase() + word.substring 1
typeIsArray : Array.isArray || ( value ) -> return {}.toString.call( value ) is '[object Array]'
nullFuc : ->
module.exports = Tool

View File

@@ -22,7 +22,7 @@
"jade": "*",
"i18next": "*",
"coffee-script": "*",
"mongous" : "*",
"eventproxy" : "0.2.6"
"mongodb" : "*",
"underscore" : "*"
}
}