1 | _ = require "lodash"
|
2 | Flat = require "flat"
|
3 | flatten = Flat.flatten
|
4 | unflatten = Flat.unflatten
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | unpackObjectOrArray = (object) ->
|
11 | if _.isNull object then return
|
12 | if object.Item then object = object.Item
|
13 | if object.Items then object = object.Items
|
14 | if object.Attributes then object = object.Attributes
|
15 | if _.isArray object then return object.map unpackObjectOrArray
|
16 |
|
17 | result = {}
|
18 | for key, value of object
|
19 | if value.S then result[key] = value.S
|
20 | if value.N then result[key] = parseFloat value.N
|
21 | if value.B
|
22 | value.B = new Buffer(value.B, "base64").toString "ascii"
|
23 | result[key] = switch
|
24 | when value.B is "true" then true
|
25 | when value.B is "false" then false
|
26 | else value.B
|
27 |
|
28 | if value.SS then result[key] = value.SS
|
29 | if value.NS then result[key] = _.map value.NS, (i) -> parseFloat i
|
30 |
|
31 | unflatten result
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 | packObjectOrArray = (object, keepEmpty) ->
|
38 | object = flatten object
|
39 |
|
40 | if _.isNull object then return
|
41 | if _.isArray object then return object.map packObjectOrArray
|
42 |
|
43 | result = {}
|
44 | for key, value of object
|
45 | if !keepEmpty and _.isEmpty value then continue
|
46 | if _.isBoolean value
|
47 | result[key] = {B: new Buffer(do value.toString).toString "base64"}
|
48 | if _.isString value then result[key] = {S: do value.toString}
|
49 | if _.isNumber value then result[key] = {N: do value.toString}
|
50 | if _.isArray value
|
51 | isNumberArray = _.every value, (n) ->
|
52 | _.isNumber n
|
53 |
|
54 | value = _.map value, (i) -> do i.toString
|
55 | if isNumberArray then result[key] = {NS: value}
|
56 | else result[key] = {SS: value}
|
57 |
|
58 | result
|
59 |
|
60 |
|
61 |
|
62 |
|
63 |
|
64 | formatForUpdate = (object) ->
|
65 | object = packObjectOrArray object, true
|
66 |
|
67 | result = {}
|
68 | for key, value of object
|
69 | if _.isEmpty(_.toArray(value)[0])
|
70 | result[key] =
|
71 | Action: "DELETE"
|
72 | else
|
73 | result[key] =
|
74 | Value: value
|
75 | Action: "PUT"
|
76 |
|
77 | result
|
78 |
|
79 |
|
80 |
|
81 |
|
82 |
|
83 | objectToQuery = (object) ->
|
84 | object = packObjectOrArray object
|
85 | result = {}
|
86 |
|
87 | for key, value of object
|
88 | result[key] =
|
89 | ComparisonOperator: "EQ"
|
90 | AttributeValueList: [value]
|
91 |
|
92 | result
|
93 |
|
94 |
|
95 |
|
96 |
|
97 |
|
98 |
|
99 | sortAndClean = (data) ->
|
100 | if _.isArray data
|
101 | result = _.sortBy data, "_createTimeStamp"
|
102 | _.forEach result, (item) ->
|
103 | delete item._createTimeStamp
|
104 | else if _.isPlainObject data
|
105 | result = data
|
106 | delete result._createTimeStamp
|
107 |
|
108 | result
|
109 |
|
110 | module.exports =
|
111 | formatForUpdate: formatForUpdate
|
112 | objectToQuery: objectToQuery
|
113 | packObjectOrArray: packObjectOrArray
|
114 | unpackObjectOrArray: unpackObjectOrArray
|
115 | sortAndClean: sortAndClean
|