-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathupsert.js
61 lines (49 loc) · 931 Bytes
/
upsert.js
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
/* @flow */
/* ::
type Options<Key> =
{
key: (Key) => Object,
}
import type { Table } from './table/table'
*/
var assign = Object.assign
var method = require('./tx/method')
var exists = require('./exists')
var defaults =
{
key: (id) => ({ id }),
}
module.exports = function upsert /* ::<Key, Data: Object> */
(
table /* :Table */,
options /* :?Options<Key> */
)
{
var kx = table.kx
var $options /* :Options<Key> */ = { ...defaults, ...options }
return method/* ::<Data> */(kx, (tx, key /* :Key */, data /* :Data */) =>
{
var data_compose = assign($options.key(key), data)
return byId(table, tx, key)
.then(exists)
.then(so =>
{
if (so)
{
return byId(table, tx, key)
.update(data)
}
else
{
return table(tx)
.insert(data_compose)
}
})
.then(() => data_compose)
})
function byId (table, tx, key /* :Key */)
{
return table(tx)
.where($options.key(key))
}
}