@platformatic/sql-events 0.16.0 → 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 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.16.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.10.2",
18
- "ioredis": "^5.2.4",
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.2",
22
- "tsd": "^0.25.0",
23
- "@platformatic/sql-mapper": "0.16.0"
21
+ "tap": "^16.3.4",
22
+ "tsd": "^0.26.0",
23
+ "@platformatic/sql-mapper": "0.17.0"
24
24
  },
25
25
  "dependencies": {
26
- "fastify-plugin": "^4.4.0",
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
+ })