@@ -109,7 +109,13 @@ export class PostgresReportStorageFactory implements storage.ReportStorageFactor
109109 }
110110 }
111111
112- private mapListCurrentConnectionsResponse ( result : SdkReportingDecoded ) : ListCurrentConnections {
112+ private mapListCurrentConnectionsResponse ( result : SdkReportingDecoded | null ) : ListCurrentConnections {
113+ if ( ! result ) {
114+ return {
115+ users : 0 ,
116+ sdks : [ ]
117+ } ;
118+ }
113119 return {
114120 users : Number ( result . users ) ,
115121 sdks : result . sdks ?. data || [ ]
@@ -228,140 +234,132 @@ export class PostgresReportStorageFactory implements storage.ReportStorageFactor
228234 const jwtExpIsoString = jwt_exp ! . toISOString ( ) ;
229235 const { gte, lt } = this . updateTableFilter ( ) ;
230236 const uuid = v4 ( ) ;
231- const result = await this . db . query ( {
232- statement : `
233- UPDATE sdk_report_events
234- SET connect_at = $1::timestamptz,
235- sdk = $2,
236- user_agent = $3,
237- jwt_exp = $4::timestamptz,
238- disconnect_at = NULL
239- WHERE user_id = $5
240- AND client_id = $6
241- AND connect_at >= $7::timestamptz
242- AND connect_at < $8::timestamptz;
243- ` ,
244- params : [
245- { type : 1184 , value : connectIsoString } ,
246- { type : 'varchar' , value : sdk } ,
247- { type : 'varchar' , value : user_agent } ,
248- { type : 1184 , value : jwtExpIsoString } ,
249- { type : 'varchar' , value : user_id } ,
250- { type : 'varchar' , value : client_id } ,
251- { type : 1184 , value : gte } ,
252- { type : 1184 , value : lt }
253- ]
254- } ) ;
255- if ( result . rows . length === 0 ) {
256- await this . db . query ( {
257- statement : `
258- INSERT INTO sdk_report_events (
259- user_id, client_id, connect_at, sdk, user_agent, jwt_exp, id
260- )
261- SELECT $1, $2, $3::timestamptz, $4, $5, $6::timestamptz, $7
262- WHERE NOT EXISTS (
263- SELECT 1 FROM sdk_report_events
264- WHERE user_id = $1
265- AND client_id = $2
266- AND connect_at >= $8::timestamptz
267- AND connect_at < $9::timestamptz
268- );` ,
269- params : [
270- { type : 'varchar' , value : user_id } ,
271- { type : 'varchar' , value : client_id } ,
272- { type : 1184 , value : connectIsoString } ,
273- { type : 'varchar' , value : sdk } ,
274- { type : 'varchar' , value : user_agent } ,
275- { type : 1184 , value : jwtExpIsoString } ,
276- { type : 'varchar' , value : uuid } ,
277- { type : 1184 , value : gte } ,
278- { type : 1184 , value : lt }
279- ]
280- } ) ;
237+ const result = await this . db . sql `
238+ UPDATE sdk_report_events
239+ SET
240+ connect_at = ${ { type : 1184 , value : connectIsoString } } ,
241+ sdk = ${ { type : 'varchar' , value : sdk } } ,
242+ user_agent = ${ { type : 'varchar' , value : user_agent } } ,
243+ jwt_exp = ${ { type : 1184 , value : jwtExpIsoString } } ,
244+ disconnect_at = NULL
245+ WHERE
246+ user_id = ${ { type : 'varchar' , value : user_id } }
247+ AND client_id = ${ { type : 'varchar' , value : client_id } }
248+ AND connect_at >= ${ { type : 1184 , value : gte } }
249+ AND connect_at < ${ { type : 1184 , value : lt } } ;
250+ ` . rows ( ) ;
251+ if ( result . length === 0 ) {
252+ await this . db . sql `
253+ INSERT INTO
254+ sdk_report_events (
255+ user_id,
256+ client_id,
257+ connect_at,
258+ sdk,
259+ user_agent,
260+ jwt_exp,
261+ id
262+ )
263+ SELECT
264+ ${ { type : 'varchar' , value : user_id } } ,
265+ ${ { type : 'varchar' , value : client_id } } ,
266+ ${ { type : 1184 , value : connectIsoString } } ,
267+ ${ { type : 'varchar' , value : sdk } } ,
268+ ${ { type : 'varchar' , value : user_agent } } ,
269+ ${ { type : 1184 , value : jwtExpIsoString } } ,
270+ ${ { type : 'varchar' , value : uuid } }
271+ WHERE
272+ NOT EXISTS (
273+ SELECT
274+ 1
275+ FROM
276+ sdk_report_events
277+ WHERE
278+ user_id = ${ { type : 'varchar' , value : user_id } }
279+ AND client_id = ${ { type : 'varchar' , value : client_id } }
280+ AND connect_at >= ${ { type : 1184 , value : gte } }
281+ AND connect_at < ${ { type : 1184 , value : lt } }
282+ );
283+ ` . execute ( ) ;
281284 }
282285 }
283286 async reportSdkDisconnect ( data : SdkDisconnectEventData ) : Promise < void > {
284287 const { user_id, client_id, disconnect_at } = data ;
285288 const disconnectIsoString = disconnect_at . toISOString ( ) ;
286289 const { gte, lt } = this . updateTableFilter ( ) ;
287- const query = `
290+ await this . db . sql `
288291 UPDATE sdk_report_events
289292 SET
290- disconnect_at = CAST($1 AS TIMESTAMP WITH TIME ZONE) ,
293+ disconnect_at = ${ { type : 1184 , value : disconnectIsoString } } ,
291294 jwt_exp = NULL
292- WHERE user_id = $2
293- AND client_id = $3
294- AND connect_at >= CAST($4 AS TIMESTAMP WITH TIME ZONE)
295- AND connect_at < CAST($5 AS TIMESTAMP WITH TIME ZONE);` ;
296-
297- const result = await this . db . query ( {
298- statement : query ,
299- params : [
300- { type : 1184 , value : disconnectIsoString } ,
301- { type : 'varchar' , value : user_id } ,
302- { type : 'varchar' , value : client_id } ,
303- { type : 1184 , value : gte } ,
304- { type : 1184 , value : lt }
305- ]
306- } ) ;
295+ WHERE
296+ user_id = ${ { type : 'varchar' , value : user_id } }
297+ AND client_id = ${ { type : 'varchar' , value : client_id } }
298+ AND connect_at >= ${ { type : 1184 , value : gte } }
299+ AND connect_at < ${ { type : 1184 , value : lt } } ;
300+ ` . execute ( ) ;
307301 }
308302 async listCurrentConnections ( data : ListCurrentConnectionsRequest ) : Promise < ListCurrentConnections > {
309303 const result = await this . listConnectionsQuery ( data ) ;
310- if ( ! result ) {
311- return {
312- users : 0 ,
313- sdks : [ ]
314- } ;
315- }
316304 return this . mapListCurrentConnectionsResponse ( result ) ;
317305 }
318306
319307 async scrapeSdkData ( data : ScrapeSdkDataRequest ) : Promise < ListCurrentConnections > {
320308 const { timeframe, interval } = data ;
321309 const { lt, gt } = this . timeFrameQuery ( timeframe , interval ) ;
322- const query = `
323- WITH filtered AS (
324- SELECT *
325- FROM sdk_report_events
326- WHERE connect_at > CAST($1 AS TIMESTAMP WITH TIME ZONE)
327- AND connect_at <= CAST($2 AS TIMESTAMP WITH TIME ZONE)
328- ),
329- unique_users AS (
330- SELECT COUNT(DISTINCT user_id) AS count
331- FROM filtered
332- ),
333- sdk_versions_array AS (
334- SELECT sdk,
335- COUNT(*) AS total,
310+ const result = await this . db . sql `
311+ WITH
312+ filtered AS (
313+ SELECT
314+ *
315+ FROM
316+ sdk_report_events
317+ WHERE
318+ connect_at > ${ { type : 1184 , value : gt } }
319+ AND connect_at <= ${ { type : 1184 , value : lt } }
320+ ),
321+ unique_users AS (
322+ SELECT
323+ COUNT(DISTINCT user_id) AS count
324+ FROM
325+ filtered
326+ ),
327+ sdk_versions_array AS (
328+ SELECT
329+ sdk,
336330 COUNT(DISTINCT client_id) AS clients,
337331 COUNT(DISTINCT user_id) AS users
338- FROM filtered
339- GROUP BY sdk
340- )
341- SELECT COALESCE(u.count, 0) AS users, JSON_AGG(ROW_TO_JSON(s)) AS sdks
342- FROM unique_users u
343- JOIN sdk_versions_array s ON TRUE;
344- ` ;
345- const result = await this . db . query ( { statement : query , params : [ { value : gt } , { value : lt } ] } ) ;
346- console . log ( result . rows ) ;
347- return {
348- users : 0 ,
349- sdks : [ ]
350- } ;
332+ FROM
333+ filtered
334+ GROUP BY
335+ sdk
336+ )
337+ SELECT
338+ COALESCE(u.count, 0) AS users,
339+ JSON_AGG(ROW_TO_JSON(s)) AS sdks
340+ FROM
341+ unique_users u
342+ JOIN sdk_versions_array s ON TRUE;
343+ `
344+ . decoded ( SdkReporting )
345+ . first ( ) ;
346+ return this . mapListCurrentConnectionsResponse ( result ) ;
351347 }
352348 async deleteOldSdkData ( data : DeleteOldSdkData ) : Promise < void > {
353349 const { timeframe, interval } = data ;
354350 const { lt } = this . timeFrameDeleteQuery ( timeframe , interval ) ;
355- const query = `
356- DELETE FROM sdk_report_events
357- WHERE connect_at < CAST($1 AS TIMESTAMP WITH TIME ZONE)
358- AND (
359- disconnect_at IS NOT NULL
360- OR (jwt_exp < NOW() AND disconnect_at IS NULL)
361- );
362- ` ;
363- const params = [ { value : lt } ] ;
364- await this . db . query ( { statement : query , params } ) ;
351+ await this . db . sql `
352+ DELETE FROM sdk_report_events
353+ WHERE
354+ connect_at < ${ { type : 1184 , value : lt } }
355+ AND (
356+ disconnect_at IS NOT NULL
357+ OR (
358+ jwt_exp < NOW()
359+ AND disconnect_at IS NULL
360+ )
361+ );
362+ ` . execute ( ) ;
365363 }
366364
367365 async [ Symbol . asyncDispose ] ( ) {
0 commit comments