UNPKG

3.53 kBtext/coffeescriptView Raw
1_ = require "lodash"
2Flat = require "flat"
3flatten = Flat.flatten
4unflatten = Flat.unflatten
5
6# Convert Dynamo AttributeValue map object(s) to plain javascript object(s)
7#
8# @param {Object|Array.<Object>} obj Dynamo AttributeValue map object(s)
9# @return {Object|Array.<Object>} plain javascript object(s)
10unpackObjectOrArray = (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# Convert plain javascript object(s) to Dynamo AttributeValue map object(s)
34#
35# @param {Object|Array.<Object>} plain javascript object(s)
36# @return {Object|Array.<Object>} obj Dynamo AttributeValue map object(s)
37packObjectOrArray = (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# Format an plain object to DynamoDB update request format
61#
62# @param {Object} object - plain javascript object
63# @return {Object} Dynamo AttributeValue map object(s)
64formatForUpdate = (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# Format an plain object to DynamoDB query request format
80#
81# @param {Object} object - plain javascript object
82# @return {Object} Dynamo AttributeValue map object(s)
83objectToQuery = (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# Sort data by `_createTimeStamp` attribute
95# and delete the private attribute
96#
97# @param {Object|Array} data
98# @return {Object|Array|null} result
99sortAndClean = (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
110module.exports =
111 formatForUpdate: formatForUpdate
112 objectToQuery: objectToQuery
113 packObjectOrArray: packObjectOrArray
114 unpackObjectOrArray: unpackObjectOrArray
115 sortAndClean: sortAndClean