11import type { IPushToken , Optional } from '@rocket.chat/core-typings' ;
22import { PushToken } from '@rocket.chat/models' ;
33
4- import { logger } from '../logger' ;
54import { findDocumentToUpdate } from './findDocumentToUpdate' ;
5+ import { logger } from '../logger' ;
66
7- export async function registerPushToken (
8- data : Optional < Pick < IPushToken , '_id' | 'token' | 'authToken' | 'appName' | 'userId' | 'metadata' > , '_id' | 'metadata' > ,
9- ) : Promise < IPushToken [ '_id' ] > {
10- const doc = await findDocumentToUpdate ( data ) ;
11-
12- if ( ! doc ) {
13- const insertResult = await PushToken . insertToken ( {
14- ...( data . _id && { _id : data . _id } ) ,
15- token : data . token ,
16- authToken : data . authToken ,
17- appName : data . appName ,
18- userId : data . userId ,
19- ...( data . metadata && { metadata : data . metadata } ) ,
20- } ) ;
7+ export type PushTokenData = Optional <
8+ Pick < IPushToken , '_id' | 'token' | 'authToken' | 'appName' | 'userId' | 'metadata' | 'voipToken' > ,
9+ '_id' | 'metadata'
10+ > ;
2111
22- const { authToken : _ , ...dataWithNoAuthToken } = data ;
23- logger . debug ( { msg : 'Push token added' , dataWithNoAuthToken, insertResult } ) ;
12+ function canModifyTokenDocument ( doc : IPushToken , data : Partial < IPushToken > ) : boolean {
13+ // If there's no voip on either side of the operation, any doc can be updated
14+ if ( ! doc . voipToken && ! data . voipToken ) {
15+ return true ;
16+ }
2417
25- return insertResult . insertedId ;
18+ // VoIP tokens MUST be referenced by id, so if there's no id on the data, do not let this doc be changed
19+ if ( ! data . _id || data . _id !== doc . _id ) {
20+ return false ;
2621 }
2722
23+ return true ;
24+ }
25+
26+ async function insertToken ( data : PushTokenData ) : Promise < IPushToken [ '_id' ] > {
27+ const insertResult = await PushToken . insertToken ( {
28+ ...( data . _id && { _id : data . _id } ) ,
29+ token : data . token ,
30+ authToken : data . authToken ,
31+ appName : data . appName ,
32+ userId : data . userId ,
33+ ...( data . metadata && { metadata : data . metadata } ) ,
34+ ...( data . voipToken && data . _id && { voipToken : data . voipToken } ) ,
35+ } ) ;
36+
37+ const { authToken : _ , ...dataWithNoAuthToken } = data ;
38+ logger . debug ( { msg : 'Push token added' , dataWithNoAuthToken, insertResult } ) ;
39+
40+ return insertResult . insertedId ;
41+ }
42+
43+ async function updateToken ( doc : IPushToken , data : PushTokenData ) : Promise < IPushToken [ '_id' ] > {
2844 const updateResult = await PushToken . refreshTokenById ( doc . _id , {
2945 token : data . token ,
3046 authToken : data . authToken ,
3147 appName : data . appName ,
3248 userId : data . userId ,
49+ ...( data . voipToken && { voipToken : data . voipToken } ) ,
3350 } ) ;
3451
3552 if ( updateResult . modifiedCount ) {
@@ -39,3 +56,13 @@ export async function registerPushToken(
3956
4057 return doc . _id ;
4158}
59+
60+ export async function registerPushToken ( data : PushTokenData ) : Promise < IPushToken [ '_id' ] > {
61+ const doc = await findDocumentToUpdate ( data ) ;
62+
63+ if ( ! doc || ! canModifyTokenDocument ( doc , data ) ) {
64+ return insertToken ( data ) ;
65+ }
66+
67+ return updateToken ( doc , data ) ;
68+ }
0 commit comments