@platformatic/sql-events 0.15.1 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +13 -0
- package/index.js +2 -1
- package/package.json +8 -7
- package/test/camelcase.test.js +305 -0
package/NOTICE
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Copyright 2022 Platformatic
|
|
2
|
+
|
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
you may not use this file except in compliance with the License.
|
|
5
|
+
You may obtain a copy of the License at
|
|
6
|
+
|
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
|
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
See the License for the specific language governing permissions and
|
|
13
|
+
limitations under the License.
|
package/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
const MQEmitter = require('mqemitter')
|
|
4
4
|
const fp = require('fastify-plugin')
|
|
5
|
+
const camelcase = require('camelcase')
|
|
5
6
|
const { PassThrough } = require('stream')
|
|
6
7
|
const MQEmitterRedis = require('mqemitter-redis')
|
|
7
8
|
const { promisify } = require('util')
|
|
@@ -26,7 +27,7 @@ function setupEmitter ({ log, mq, mapper, connectionString }) {
|
|
|
26
27
|
if (entity.primaryKeys.size !== 1) {
|
|
27
28
|
continue
|
|
28
29
|
}
|
|
29
|
-
const primaryKey = entity.primaryKeys.values().next().value
|
|
30
|
+
const primaryKey = camelcase(entity.primaryKeys.values().next().value)
|
|
30
31
|
mapper.addEntityHooks(entityName, {
|
|
31
32
|
async save (original, data) {
|
|
32
33
|
const ctx = data.ctx
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@platformatic/sql-events",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"description": "Emit events via MQEmitter",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"repository": {
|
|
@@ -14,16 +14,17 @@
|
|
|
14
14
|
},
|
|
15
15
|
"homepage": "https://github.com/platformatic/platformatic#readme",
|
|
16
16
|
"devDependencies": {
|
|
17
|
-
"fastify": "^4.
|
|
18
|
-
"ioredis": "^5.
|
|
17
|
+
"fastify": "^4.13.0",
|
|
18
|
+
"ioredis": "^5.3.1",
|
|
19
19
|
"snazzy": "^9.0.0",
|
|
20
20
|
"standard": "^17.0.0",
|
|
21
|
-
"tap": "^16.3.
|
|
22
|
-
"tsd": "^0.
|
|
23
|
-
"@platformatic/sql-mapper": "0.
|
|
21
|
+
"tap": "^16.3.4",
|
|
22
|
+
"tsd": "^0.26.0",
|
|
23
|
+
"@platformatic/sql-mapper": "0.17.0"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"
|
|
26
|
+
"camelcase": "^6.3.0",
|
|
27
|
+
"fastify-plugin": "^4.5.0",
|
|
27
28
|
"mqemitter": "^5.0.0",
|
|
28
29
|
"mqemitter-redis": "^5.0.0"
|
|
29
30
|
},
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const { test } = require('tap')
|
|
4
|
+
const sqlMapper = require('@platformatic/sql-mapper')
|
|
5
|
+
const { connect } = sqlMapper
|
|
6
|
+
const { clear, connInfo, isSQLite } = require('./helper')
|
|
7
|
+
const sqlEvents = require('..')
|
|
8
|
+
const { setupEmitter } = sqlEvents
|
|
9
|
+
const MQEmitter = require('mqemitter')
|
|
10
|
+
const fastify = require('fastify')
|
|
11
|
+
|
|
12
|
+
const fakeLogger = {
|
|
13
|
+
trace () {},
|
|
14
|
+
error () {}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
test('emit events when there is a primary key to be camelised', async ({ equal, same, teardown }) => {
|
|
18
|
+
async function onDatabaseLoad (db, sql) {
|
|
19
|
+
await clear(db, sql)
|
|
20
|
+
teardown(() => db.dispose())
|
|
21
|
+
|
|
22
|
+
if (isSQLite) {
|
|
23
|
+
await db.query(sql`CREATE TABLE pages (
|
|
24
|
+
page_id INTEGER PRIMARY KEY,
|
|
25
|
+
title VARCHAR(42)
|
|
26
|
+
);`)
|
|
27
|
+
} else {
|
|
28
|
+
await db.query(sql`CREATE TABLE pages (
|
|
29
|
+
page_id SERIAL PRIMARY KEY,
|
|
30
|
+
title VARCHAR(255) NOT NULL
|
|
31
|
+
);`)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const mapper = await connect({
|
|
35
|
+
log: fakeLogger,
|
|
36
|
+
...connInfo,
|
|
37
|
+
onDatabaseLoad
|
|
38
|
+
})
|
|
39
|
+
const pageEntity = mapper.entities.page
|
|
40
|
+
|
|
41
|
+
const mq = MQEmitter()
|
|
42
|
+
equal(setupEmitter({ mapper, mq, log: fakeLogger }), undefined)
|
|
43
|
+
const queue = await mapper.subscribe([
|
|
44
|
+
'/entity/page/save/+',
|
|
45
|
+
'/entity/page/delete/+'
|
|
46
|
+
])
|
|
47
|
+
equal(mapper.mq, mq)
|
|
48
|
+
|
|
49
|
+
const expected = []
|
|
50
|
+
|
|
51
|
+
// save - new record
|
|
52
|
+
const page = await pageEntity.save({
|
|
53
|
+
input: { title: 'fourth page' }
|
|
54
|
+
})
|
|
55
|
+
expected.push({
|
|
56
|
+
topic: '/entity/page/save/' + page.pageId,
|
|
57
|
+
payload: {
|
|
58
|
+
pageId: page.pageId
|
|
59
|
+
}
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
// save - update record
|
|
63
|
+
const page2 = await pageEntity.save({
|
|
64
|
+
input: {
|
|
65
|
+
pageId: page.pageId,
|
|
66
|
+
title: 'fifth page'
|
|
67
|
+
}
|
|
68
|
+
})
|
|
69
|
+
expected.push({
|
|
70
|
+
topic: '/entity/page/save/' + page.pageId,
|
|
71
|
+
payload: {
|
|
72
|
+
pageId: page2.pageId
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
await pageEntity.delete({
|
|
77
|
+
where: {
|
|
78
|
+
pageId: {
|
|
79
|
+
eq: page.pageId
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
fields: ['pageId', 'title']
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
expected.push({
|
|
86
|
+
topic: '/entity/page/delete/' + page.pageId,
|
|
87
|
+
payload: {
|
|
88
|
+
pageId: page.pageId
|
|
89
|
+
}
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
for await (const ev of queue) {
|
|
93
|
+
same(ev, expected.shift())
|
|
94
|
+
if (expected.length === 0) {
|
|
95
|
+
break
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
test('return entities', async ({ pass, teardown, equal, same }) => {
|
|
101
|
+
async function onDatabaseLoad (db, sql) {
|
|
102
|
+
await clear(db, sql)
|
|
103
|
+
|
|
104
|
+
if (isSQLite) {
|
|
105
|
+
await db.query(sql`CREATE TABLE pages (
|
|
106
|
+
page_id INTEGER PRIMARY KEY,
|
|
107
|
+
title VARCHAR(42)
|
|
108
|
+
);`)
|
|
109
|
+
} else {
|
|
110
|
+
await db.query(sql`CREATE TABLE pages (
|
|
111
|
+
page_id SERIAL PRIMARY KEY,
|
|
112
|
+
title VARCHAR(255) NOT NULL
|
|
113
|
+
);`)
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const app = fastify()
|
|
117
|
+
teardown(() => app.close())
|
|
118
|
+
app.register(sqlMapper, {
|
|
119
|
+
connectionString: connInfo.connectionString,
|
|
120
|
+
onDatabaseLoad
|
|
121
|
+
})
|
|
122
|
+
app.register(sqlEvents)
|
|
123
|
+
|
|
124
|
+
await app.ready()
|
|
125
|
+
const pageEntity = app.platformatic.entities.page
|
|
126
|
+
const queue = await app.platformatic.subscribe([
|
|
127
|
+
'/entity/page/save/+',
|
|
128
|
+
'/entity/page/delete/+'
|
|
129
|
+
])
|
|
130
|
+
|
|
131
|
+
const expected = []
|
|
132
|
+
|
|
133
|
+
// save - new record
|
|
134
|
+
const page = await pageEntity.save({
|
|
135
|
+
input: { title: 'fourth page' }
|
|
136
|
+
})
|
|
137
|
+
expected.push({
|
|
138
|
+
topic: '/entity/page/save/' + page.pageId,
|
|
139
|
+
payload: {
|
|
140
|
+
pageId: page.pageId
|
|
141
|
+
}
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
// save - update record
|
|
145
|
+
await pageEntity.save({
|
|
146
|
+
input: {
|
|
147
|
+
pageId: page.pageId,
|
|
148
|
+
title: 'fifth page'
|
|
149
|
+
}
|
|
150
|
+
})
|
|
151
|
+
expected.push({
|
|
152
|
+
topic: '/entity/page/save/' + page.pageId,
|
|
153
|
+
payload: {
|
|
154
|
+
pageId: page.pageId
|
|
155
|
+
}
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
await pageEntity.delete({
|
|
159
|
+
where: {
|
|
160
|
+
pageId: {
|
|
161
|
+
eq: page.pageId
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
})
|
|
165
|
+
|
|
166
|
+
expected.push({
|
|
167
|
+
topic: '/entity/page/delete/' + page.pageId,
|
|
168
|
+
payload: {
|
|
169
|
+
pageId: page.pageId
|
|
170
|
+
}
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
for await (const ev of queue) {
|
|
174
|
+
same(ev, expected.shift())
|
|
175
|
+
if (expected.length === 0) {
|
|
176
|
+
break
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
test('insert', async ({ equal, same, teardown }) => {
|
|
182
|
+
async function onDatabaseLoad (db, sql) {
|
|
183
|
+
await clear(db, sql)
|
|
184
|
+
teardown(() => db.dispose())
|
|
185
|
+
|
|
186
|
+
if (isSQLite) {
|
|
187
|
+
await db.query(sql`CREATE TABLE pages (
|
|
188
|
+
page_id INTEGER PRIMARY KEY,
|
|
189
|
+
title VARCHAR(42)
|
|
190
|
+
);`)
|
|
191
|
+
} else {
|
|
192
|
+
await db.query(sql`CREATE TABLE pages (
|
|
193
|
+
page_id SERIAL PRIMARY KEY,
|
|
194
|
+
title VARCHAR(255) NOT NULL
|
|
195
|
+
);`)
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
const mapper = await connect({
|
|
199
|
+
log: fakeLogger,
|
|
200
|
+
...connInfo,
|
|
201
|
+
onDatabaseLoad
|
|
202
|
+
})
|
|
203
|
+
const pageEntity = mapper.entities.page
|
|
204
|
+
|
|
205
|
+
const mq = MQEmitter()
|
|
206
|
+
equal(setupEmitter({ mapper, mq, log: fakeLogger }), undefined)
|
|
207
|
+
const queue = await mapper.subscribe('/entity/page/save/+')
|
|
208
|
+
equal(mapper.mq, mq)
|
|
209
|
+
|
|
210
|
+
const expected = []
|
|
211
|
+
|
|
212
|
+
// save - new record
|
|
213
|
+
const pages = await pageEntity.insert({
|
|
214
|
+
inputs: [{
|
|
215
|
+
title: 'fourth page'
|
|
216
|
+
}, {
|
|
217
|
+
title: 'fifth page'
|
|
218
|
+
}]
|
|
219
|
+
})
|
|
220
|
+
|
|
221
|
+
for (const page of pages) {
|
|
222
|
+
expected.push({
|
|
223
|
+
topic: '/entity/page/save/' + page.pageId,
|
|
224
|
+
payload: {
|
|
225
|
+
pageId: page.pageId
|
|
226
|
+
}
|
|
227
|
+
})
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
for await (const ev of queue) {
|
|
231
|
+
same(ev, expected.shift())
|
|
232
|
+
if (expected.length === 0) {
|
|
233
|
+
break
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
})
|
|
237
|
+
|
|
238
|
+
test('more than one element for delete', async ({ equal, same, teardown }) => {
|
|
239
|
+
async function onDatabaseLoad (db, sql) {
|
|
240
|
+
await clear(db, sql)
|
|
241
|
+
teardown(() => db.dispose())
|
|
242
|
+
|
|
243
|
+
if (isSQLite) {
|
|
244
|
+
await db.query(sql`CREATE TABLE pages (
|
|
245
|
+
page_id INTEGER PRIMARY KEY,
|
|
246
|
+
title VARCHAR(42)
|
|
247
|
+
);`)
|
|
248
|
+
} else {
|
|
249
|
+
await db.query(sql`CREATE TABLE pages (
|
|
250
|
+
page_id SERIAL PRIMARY KEY,
|
|
251
|
+
title VARCHAR(255) NOT NULL
|
|
252
|
+
);`)
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
const mapper = await connect({
|
|
256
|
+
log: fakeLogger,
|
|
257
|
+
...connInfo,
|
|
258
|
+
onDatabaseLoad
|
|
259
|
+
})
|
|
260
|
+
const pageEntity = mapper.entities.page
|
|
261
|
+
|
|
262
|
+
const mq = MQEmitter()
|
|
263
|
+
equal(setupEmitter({ mapper, mq, log: fakeLogger }), undefined)
|
|
264
|
+
const queue = await mapper.subscribe([
|
|
265
|
+
'/entity/page/delete/+'
|
|
266
|
+
])
|
|
267
|
+
equal(mapper.mq, mq)
|
|
268
|
+
|
|
269
|
+
const expected = []
|
|
270
|
+
|
|
271
|
+
const page1 = await pageEntity.save({
|
|
272
|
+
input: { title: 'fourth page' }
|
|
273
|
+
})
|
|
274
|
+
|
|
275
|
+
const page2 = await pageEntity.save({
|
|
276
|
+
input: { title: 'fifth page' }
|
|
277
|
+
})
|
|
278
|
+
|
|
279
|
+
// delete all pages
|
|
280
|
+
await pageEntity.delete({
|
|
281
|
+
where: {},
|
|
282
|
+
fields: ['pageId', 'title']
|
|
283
|
+
})
|
|
284
|
+
|
|
285
|
+
expected.push({
|
|
286
|
+
topic: '/entity/page/delete/' + page1.pageId,
|
|
287
|
+
payload: {
|
|
288
|
+
pageId: page1.pageId
|
|
289
|
+
}
|
|
290
|
+
})
|
|
291
|
+
|
|
292
|
+
expected.push({
|
|
293
|
+
topic: '/entity/page/delete/' + page2.pageId,
|
|
294
|
+
payload: {
|
|
295
|
+
pageId: page2.pageId
|
|
296
|
+
}
|
|
297
|
+
})
|
|
298
|
+
|
|
299
|
+
for await (const ev of queue) {
|
|
300
|
+
same(ev, expected.shift())
|
|
301
|
+
if (expected.length === 0) {
|
|
302
|
+
break
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
})
|