@@ -50,7 +50,7 @@ export const fileTypes: Record<string, FileMessageType> = {
5050
5151/** helper to validate the username format */
5252export function validateFederatedUsername ( username : string ) : username is `@${string } :${string } ` {
53- return / ^ @ [ a - z A - Z 0 - 9 _ - ] + : [ a - z A - Z 0 - 9 _ - ] + $ / . test ( username ) ;
53+ return / ^ @ [ a - z A - Z 0 - 9 . _ = - ] + : [ a - z A - Z 0 - 9 . : _ - ] + $ / . test ( username ) ;
5454}
5555
5656/**
@@ -62,12 +62,11 @@ export function validateFederatedUsername(username: string): username is `@${str
6262export async function createOrUpdateFederatedUser ( options : {
6363 username : `@${string } :${string } `;
6464 name ?: string ;
65- status ?: UserStatus ;
6665 origin : string ;
67- } ) : Promise < { insertedId : any } > {
68- const { username, name = username , status = UserStatus . OFFLINE , origin } = options ;
66+ } ) : Promise < string > {
67+ const { username, name = username } = options ;
6968
70- return Users . updateOne (
69+ const result = await Users . updateOne (
7170 {
7271 username,
7372 } ,
@@ -76,7 +75,7 @@ export async function createOrUpdateFederatedUser(options: {
7675 username,
7776 name,
7877 type : 'user' as const ,
79- status,
78+ status : UserStatus . OFFLINE ,
8079 active : true ,
8180 roles : [ 'user' ] ,
8281 requirePasswordChange : false ,
@@ -86,14 +85,25 @@ export async function createOrUpdateFederatedUser(options: {
8685 mui : username ,
8786 origin,
8887 } ,
89- createdAt : new Date ( ) ,
9088 _updatedAt : new Date ( ) ,
9189 } ,
90+ $setOnInsert : {
91+ createdAt : new Date ( ) ,
92+ } ,
9293 } ,
9394 {
9495 upsert : true ,
9596 } ,
96- ) . then ( ( result ) => ( { insertedId : result . upsertedId } ) ) ;
97+ ) ;
98+
99+ const userId = result . upsertedId || ( await Users . findOneByUsername ( username , { projection : { _id : 1 } } ) ) ?. _id ;
100+ if ( ! userId ) {
101+ throw new Error ( `Failed to create or update federated user: ${ username } ` ) ;
102+ }
103+ if ( typeof userId !== 'string' ) {
104+ return userId . toString ( ) ;
105+ }
106+ return userId ;
97107}
98108
99109export { generateEd25519RandomSecretKey } from '@rocket.chat/federation-sdk' ;
0 commit comments