@@ -660,7 +660,7 @@ API.v1.addRoute(
660660 if ( ! canViewFullOtherUserInfo ) {
661661 return API . v1 . forbidden ( ) ;
662662 }
663- const escapedEmail = escapeRegExp ( this . queryParams . email as string ) ;
663+ const escapedEmail = escapeRegExp ( this . queryParams . email ) ;
664664 nonEmptyQuery [ 'emails.address' ] = {
665665 $regex : `^${ escapedEmail } $` ,
666666 $options : 'i' ,
@@ -1533,6 +1533,8 @@ API.v1.get(
15331533 status : 1 ,
15341534 utcOffset : 1 ,
15351535 statusText : 1 ,
1536+ statusSource : 1 ,
1537+ statusExpiresAt : 1 ,
15361538 avatarETag : 1 ,
15371539 } ,
15381540 } ;
@@ -1931,6 +1933,7 @@ API.v1
19311933 body : ajv . compile < {
19321934 status ?: UserStatus ;
19331935 message ?: string ;
1936+ expiresAt ?: string ;
19341937 userId ?: string ;
19351938 username ?: string ;
19361939 user ?: string ;
@@ -1939,6 +1942,7 @@ API.v1
19391942 properties : {
19401943 status : { type : 'string' , enum : [ 'online' , 'away' , 'offline' , 'busy' ] } ,
19411944 message : { type : 'string' , nullable : true } ,
1945+ expiresAt : { type : 'string' , nullable : true } ,
19421946 userId : { type : 'string' } ,
19431947 username : { type : 'string' } ,
19441948 user : { type : 'string' } ,
@@ -2009,6 +2013,16 @@ API.v1
20092013 statusDefault : status ,
20102014 statusSource : 'manual' ,
20112015 ...( this . bodyParams . message != null && { statusText : this . bodyParams . message } ) ,
2016+ ...( this . bodyParams . expiresAt &&
2017+ ( ( ) => {
2018+ const date = new Date ( this . bodyParams . expiresAt ) ;
2019+ if ( isNaN ( date . getTime ( ) ) ) {
2020+ throw new Meteor . Error ( 'error-invalid-date' , 'Invalid expiresAt date string' , {
2021+ method : 'users.setStatus' ,
2022+ } ) ;
2023+ }
2024+ return { statusExpiresAt : date } ;
2025+ } ) ( ) ) ,
20122026 } ) ;
20132027 }
20142028
@@ -2026,12 +2040,14 @@ API.v1
20262040 authRequired : true ,
20272041 query : isUsersGetStatusParamsGET ,
20282042 response : {
2029- 200 : ajv . compile < { _id : string ; status : string ; connectionStatus ?: string } > ( {
2043+ 200 : ajv . compile < { _id : string ; status : string ; connectionStatus ?: string ; statusSource ?: string ; statusExpiresAt ?: string } > ( {
20302044 type : 'object' ,
20312045 properties : {
20322046 _id : { type : 'string' } ,
20332047 status : statusType ,
20342048 connectionStatus : { type : 'string' , nullable : true } ,
2049+ statusSource : { type : 'string' , nullable : true } ,
2050+ statusExpiresAt : { type : 'string' , nullable : true } ,
20352051 success : { type : 'boolean' , enum : [ true ] } ,
20362052 } ,
20372053 required : [ '_id' , 'status' , 'success' ] ,
@@ -2045,18 +2061,20 @@ API.v1
20452061 if ( isUserFromParams ( this . queryParams , this . userId , this . user ) ) {
20462062 return API . v1 . success ( {
20472063 _id : this . userId ,
2048- // message: user.statusText,
20492064 connectionStatus : ( this . user . statusConnection || 'offline' ) as 'online' | 'offline' | 'away' | 'busy' ,
20502065 status : ( this . user . status || 'offline' ) as 'online' | 'offline' | 'away' | 'busy' ,
2066+ ...( this . user . statusSource && { statusSource : this . user . statusSource } ) ,
2067+ ...( this . user . statusExpiresAt && { statusExpiresAt : this . user . statusExpiresAt . toISOString ( ) } ) ,
20512068 } ) ;
20522069 }
20532070
20542071 const user = await getUserFromParams ( this . queryParams ) ;
20552072
20562073 return API . v1 . success ( {
20572074 _id : user . _id ,
2058- // message: user.statusText,
20592075 status : ( user . status || 'offline' ) as 'online' | 'offline' | 'away' | 'busy' ,
2076+ ...( user . statusSource && { statusSource : user . statusSource } ) ,
2077+ ...( user . statusExpiresAt && { statusExpiresAt : user . statusExpiresAt . toISOString ( ) } ) ,
20602078 } ) ;
20612079 } ,
20622080 ) ;
0 commit comments