2
2
import { collect } from 'streaming-iterables'
3
3
import { ServerClosure , Subscription } from '../types'
4
4
5
- export const getFilteredSubs = async ( { server, event } : { server : Omit < ServerClosure , 'gateway' > , event : { topic : string , payload ?: Record < string , any > } } ) : Promise < Subscription [ ] > => {
5
+ export const getFilteredSubs = async ( { server, event, excludeKeys = [ ] } : { server : Omit < ServerClosure , 'gateway' > , event : { topic : string , payload ?: Record < string , any > } , excludeKeys ?: string [ ] } ) : Promise < Subscription [ ] > => {
6
6
if ( ! event . payload || Object . keys ( event . payload ) . length === 0 ) {
7
- server . log ( 'getFilteredSubs' , { event } )
7
+ server . log ( 'getFilteredSubs' , { event, excludeKeys } )
8
8
9
9
const iterator = server . models . subscription . query ( {
10
10
IndexName : 'TopicIndex' ,
@@ -15,7 +15,7 @@ export const getFilteredSubs = async ({ server, event }: { server: Omit<ServerCl
15
15
16
16
return await collect ( iterator )
17
17
}
18
- const flattenPayload = collapseKeys ( event . payload )
18
+ const flattenPayload = collapseKeys ( event . payload , excludeKeys )
19
19
20
20
const filterExpressions : string [ ] = [ ]
21
21
const expressionAttributeValues : { [ key : string ] : string | number | boolean } = { }
@@ -29,7 +29,7 @@ export const getFilteredSubs = async ({ server, event }: { server: Omit<ServerCl
29
29
filterExpressions . push ( `(#filter.#${ aliasNumber } = :${ aliasNumber } OR attribute_not_exists(#filter.#${ aliasNumber } ))` )
30
30
}
31
31
32
- server . log ( 'getFilteredSubs' , { event, expressionAttributeNames, expressionAttributeValues, filterExpressions } )
32
+ server . log ( 'getFilteredSubs' , { event, excludeKeys , expressionAttributeNames, expressionAttributeValues, filterExpressions } )
33
33
34
34
const iterator = server . models . subscription . query ( {
35
35
IndexName : 'TopicIndex' ,
@@ -51,24 +51,25 @@ export const getFilteredSubs = async ({ server, event }: { server: Omit<ServerCl
51
51
52
52
export const collapseKeys = (
53
53
obj : Record < string , any > ,
54
+ excludeKeys : string [ ] = [ ] ,
55
+ parent : string [ ] = [ ] ,
54
56
) : Record < string , number | string | boolean > => {
55
57
const record = { }
56
58
for ( const [ k1 , v1 ] of Object . entries ( obj ) ) {
59
+ const path = [ ...parent , k1 ]
60
+ const key = path . join ( '.' )
61
+ if ( excludeKeys . includes ( key ) ) {
62
+ continue
63
+ }
57
64
if ( typeof v1 === 'string' || typeof v1 === 'number' || typeof v1 === 'boolean' ) {
58
- record [ k1 ] = v1
65
+ record [ key ] = v1
59
66
continue
60
67
}
61
-
62
68
if ( v1 && typeof v1 === 'object' ) {
63
- const next = { }
64
-
65
- for ( const [ k2 , v2 ] of Object . entries ( v1 ) ) {
66
- next [ `${ k1 } .${ k2 } ` ] = v2
67
- }
68
-
69
- for ( const [ k1 , v1 ] of Object . entries ( collapseKeys ( next ) ) ) {
70
- record [ k1 ] = v1
69
+ for ( const [ k2 , v2 ] of Object . entries ( collapseKeys ( v1 , excludeKeys , path ) ) ) {
70
+ record [ k2 ] = v2
71
71
}
72
+ continue
72
73
}
73
74
}
74
75
return record
0 commit comments