all files / restify-curd/coffee/ route.coffee

93.53% Statements 130/139
78.26% Branches 36/46
100% Functions 23/23
100% Lines 126/126
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174           39× 39× 39× 16× 39× 39×     12× 12×         21× 21× 21×       12× 12×     21× 21× 21× 21× 21× 21×   21×     21×           12× 12× 12× 12×   21× 21× 21× 21× 21× 21×   32× 32× 32× 32× 32× 32× 21× 21× 28×   21× 21×   11× 32× 21× 21× 21× 21× 21×   11×                                      
mongoose = require 'mongoose'
async = require 'async'
# 参数:model,内嵌文档的字段名
 
module.exports = (Model,ids=[])->
    copyIds = (k for k in ids)
    parentName = Model.modelName # 模型名称
    # baseNameOfID = "#{ids[0]}id"
    baseId = copyIds[0]+'id'
    lastId = copyIds[copyIds.length-1]+'id'
    prevId = copyIds[copyIds.length-2]+'id'
 
    # 获取基础查询条件
    getBaseQuery = (req)->
        baseQuery = {}
        baseQuery._id = req.params[baseId]
        if copyIds.length>2
            baseQuery[copyIds[1..-2].join('.')+'._id'] = req.params[prevId]
        EbaseQuery._id = mongoose.Types.ObjectId baseQuery._id if baseQuery._id
        baseQuery
 
    # 获取详细查询条件
    getMoreQuery = (req)->
        baseQuery = {}
        for id,i in copyIds
            head = copyIds[1..i].join('.')
            if head
                head+='._id'
                baseQuery[head] = req.params[id+'id']
            else
                baseQuery._id = mongoose.Types.ObjectId req.params[id+'id']
        baseQuery
 
 
    # 获取基础返回结果
    getBaseResult = (req,doc)->
        result = doc
        if copyIds.length>2
            for id in copyIds[1..-2]
                result = result[id].id(req.params[id+'id'])
        result
 
    # 获取详细返回结果
    getMoreResult = (req,doc)->
        result = doc
        if copyIds.length>1
            for id in copyIds[1..]
                result = result[id].id(req.params[id+'id'])
        result
    # 获取基础的列表数据
    getBaseList = (req,doc)->
        result = doc
        if copyIds.length is 2
            return result[copyIds[1]]
        else
            for id in copyIds[1..-2]
                result = result[id].id(req.params[id+'id'])
            return result[copyIds[copyIds.length-1]]
    {
        doGetList:(req,res,next)->
            limit = Number(req.params.limit) or 0
            page = Number(req.params.page) or 1
            sortby = req.params.sortby or 'createAt'
            desc = req.params.desc or 'desc'
            fields = req.params.fields
            async.parallel
                count:(cb)->
                    Model.count cb
                list:(cb)->
                    # 直接查询
                    if ids.length is 1
                        # 是否查询指定字段
                        if fields
                            query = Model.find query,fields.split(',').join ' '
                        else
                            query = Model.find query
                        # 排序
                        sort = {}
                        sort[sortby]=desc
                        query.sort sort
                        # 分页
                        if limit
                            query.limit limit
                            query.skip (page-1)*limit
                        query.exec cb
                    else
                        query = Model.findOne getBaseQuery(req)
                        query.exec (err,doc)->
                            Ireturn cb err if err
                            cb err,getBaseList(req,doc)
            ,(err,result)->
                Ireturn res.send 500,err if err
                result.limit = limit
                result.page = page
                result.sortby = sortby
                result.desc = desc
                res.send 200,result
        doPost:(req,res,next)->
            not req.body and req.body={}
            req.body.createAt = Date.now()
            req.body.random = Math.random()
            cb = (err,doc)->
                Ireturn res.send 500,err if err
                if copyIds.length > 1
                    result = doc
                    for id in copyIds[1..]
                        result=result[id]
                    # 子文档操作时返回最后一条记录
                    docs = getBaseResult(req,doc)[copyIds[copyIds.length-1]]
                    res.send 200,docs[docs.length-1]
                else
                    res.send 200,doc
            if copyIds.length > 1
                update = {}
                update['$push'] = {}
                update['$push'][copyIds[1..].join('.$.')] = req.body
                query = getBaseQuery req
                Model.findOneAndUpdate query,update,{new:true},cb
            else
                Model.create req.body,cb
        doGet:(req,res,next)->
            Model.findOne getBaseQuery(req)
            ,(err,doc)->
                Ireturn res.send 500,err if err
                res.send 200,getMoreResult(req,doc)
 
        # 操作子文档时,更新操作非原子操作
        # https://jira.mongodb.org/browse/SERVER-831
        doEdit:(req,res,next)->
            update = {}
            query = getMoreQuery req
            not req.body and req.body = {}
            # console.log req.params,query,copyIds,typeof query._id,11111111111111,req.body
            # console.log req.body,12123,copyIds,query,typeof query._id,req.body,req.params
            if copyIds.length > 1
                Model.findOne query,(err,doc)->
                    Ireturn res.send 500,err if err
                    result = getMoreResult req,doc
                    for k,v of req.body
                        result[k]=v
                    doc.save (err,doc)->
                        Ireturn res.send 500,err if err
                        res.send 200,result
            else
                Model.findOneAndUpdate query,{$set:req.body},{new:true},(err,doc)->
                    Ireturn res.send 500,err if err
                    res.send 200,doc.toObject()
        doDelete:(req,res,next)->
            if copyIds.length > 1
                update = {}
                update[copyIds[1..].join('.$.')] = _id:req.params[lastId]
                query=Model.update getMoreQuery(req)
                ,{
                    $pull:update
                }
            else
                query=Model.remove _id:mongoose.Types.ObjectId req.params[baseId]
            query.exec (err,rows)->
                Ireturn res.send 500,err if err
                res.send 200
 
        doDeleteAll:(req,res,next)->
            if copyIds.length > 1
                query = {}
                query[copyIds[1..].join('.$.')] = req.query or {}
                query = Model.update getBaseQuery(req),{$pull:query}
            else
                query = req.query or {}
                query = Model.remove query
            query.exec (err,rows)->
                Ireturn res.send 500,err if err
                res.send 200
    }