22import { collect } from 'streaming-iterables'
33import { ServerClosure , Subscription } from '../types'
44
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 [ ] > => {
66 if ( ! event . payload || Object . keys ( event . payload ) . length === 0 ) {
7- server . log ( 'getFilteredSubs' , { event } )
7+ server . log ( 'getFilteredSubs' , { event, excludeKeys } )
88
99 const iterator = server . models . subscription . query ( {
1010 IndexName : 'TopicIndex' ,
@@ -29,7 +29,7 @@ export const getFilteredSubs = async ({ server, event }: { server: Omit<ServerCl
2929 filterExpressions . push ( `(#filter.#${ aliasNumber } = :${ aliasNumber } OR attribute_not_exists(#filter.#${ aliasNumber } ))` )
3030 }
3131
32- server . log ( 'getFilteredSubs' , { event, expressionAttributeNames, expressionAttributeValues, filterExpressions } )
32+ server . log ( 'getFilteredSubs' , { event, excludeKeys , expressionAttributeNames, expressionAttributeValues, filterExpressions } )
3333
3434 const iterator = server . models . subscription . query ( {
3535 IndexName : 'TopicIndex' ,
@@ -51,24 +51,25 @@ export const getFilteredSubs = async ({ server, event }: { server: Omit<ServerCl
5151
5252export const collapseKeys = (
5353 obj : Record < string , any > ,
54+ excludeKeys : string [ ] = [ ] ,
55+ parent : string [ ] = [ ] ,
5456) : Record < string , number | string | boolean > => {
5557 const record = { }
5658 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+ }
5764 if ( typeof v1 === 'string' || typeof v1 === 'number' || typeof v1 === 'boolean' ) {
58- record [ k1 ] = v1
65+ record [ key ] = v1
5966 continue
6067 }
61-
6268 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
7171 }
72+ continue
7273 }
7374 }
7475 return record
0 commit comments