Newer
Older
Card9-Skyworks / software / models / user.coffee
@王邈 王邈 on 6 Apr 2015 2 KB 似乎改好了
'use continuation'
mongoose = require("../utils/db")

UserSchema = new mongoose.Schema(
  name:
    type: String
    index: true
    unique: true
  identity: [ Buffer ]
)

mongoose.model "User", UserSchema
module.exports = User = mongoose.model "User"

UserSchema.pre 'save', (next) ->
  @identity ?= []

  next()

User.checkName = (name, callback) ->
  User.findOne name: name, (err, user) ->
    return callback(err) if err
    if user
      callback "username-occupied"
    else
      callback null

User.checkIdentity = (identity, callback) ->
  User.getByIdentity identity, (err, user) ->
    if err is 'no-such-user'
      callback null
    else if err
      callback err
    else
      callback 'identity-exist'

User.getByName = (name, callback) ->
  User.findOne name: name, (err, user) ->
    return callback(err) if err
    if not user
      callback 'no-such-user'
    else
      callback null, user

User.getByIdentity = (identity, callback) ->
  User.findOne identity: $elemMatch: $eq: identity, (err, user) ->
    return callback(err) if err
    if not user
      callback 'no-such-user'
    else
      callback null, user

# Create a new user
User.create = (user, callback) ->
  try
    # Normalize username and email address to lower case
    user.name = user.name.toLowerCase()
    usernameRegex = /^[a-z][a-z0-9_]{3,11}$/
    if not usernameRegex.exec(user.name)
      return callback("invalid-username")
    user = new User(user)
    callback null, user
  catch err
    callback err


User::addIdentity = (identity, callback) ->
  @identity ?= []
  self = this
  try
    User.checkIdentity(identity, obtain())
    self.identity.push identity
    self.save callback
  catch err
    callback err

User::removeIdentity = (identity, callback) ->
  i = 0
  while i < @identity.length
    if @identity[i].equals identity
      @identity = @identity.slice(0, i).concat(@identity.slice(i + 1))
      @save callback
      return
    i++
  callback "no-such-identity"

User.getOrCreateByName = (name, callback) ->
  try
    User.getByName(name, obtain(user))
    callback null, user
  catch err
    try
      if err is 'no-such-user'
        User.create({name: name}, obtain(user))
        callback null, user
      else
        throw err
    catch err2
      callback err2