33
44import {
55 ThunderIDNodeClient ,
6+ ThunderIDRuntimeError ,
7+ extractUserClaimsFromIdToken ,
8+ generateFlattenedUserProfile ,
9+ getUsersMe ,
10+ getUsersMeMeta ,
11+ resolveResourceEndpoint ,
12+ updateMeProfile ,
13+ type AttributeSchema ,
614 type AuthClientConfig ,
715 type IdToken ,
816 type Storage ,
@@ -44,6 +52,7 @@ class ThunderIDNuxtClient extends ThunderIDNodeClient<ThunderIDNuxtConfig> {
4452 clientId : config . clientId ! ,
4553 clientSecret : config . clientSecret || undefined ,
4654 enablePKCE : true ,
55+ endpoints : config . endpoints ,
4756 scopes : config . scopes || [ 'openid' , 'profile' ] ,
4857 tokenRequest : config . tokenRequest ,
4958 } as AuthClientConfig < ThunderIDNuxtConfig > ;
@@ -124,8 +133,23 @@ class ThunderIDNuxtClient extends ThunderIDNodeClient<ThunderIDNuxtConfig> {
124133 return ( configData ?. afterSignOutUrl as string ) || ( configData ?. afterSignInUrl as string ) || '/' ;
125134 }
126135
127- override getUser ( sessionId ?: string ) : Promise < User > {
128- return super . getUser ( sessionId ) ;
136+ override async getUser ( sessionId ?: string ) : Promise < User > {
137+ try {
138+ const configData : AuthClientConfig < ThunderIDNuxtConfig > = await this . getStorageManager ( ) . getConfigData ( ) ;
139+ const baseUrl : string | undefined = configData ?. baseUrl ;
140+
141+ const profile : User = await getUsersMe ( {
142+ baseUrl,
143+ url : resolveResourceEndpoint ( 'usersMe' , configData ) ,
144+ headers : {
145+ Authorization : `Bearer ${ await this . getAccessToken ( sessionId ) } ` ,
146+ } ,
147+ } ) ;
148+
149+ return profile ;
150+ } catch ( error ) {
151+ return await super . getUser ( sessionId ) ;
152+ }
129153 }
130154
131155 override getAccessToken ( sessionId ?: string ) : Promise < string > {
@@ -144,13 +168,67 @@ class ThunderIDNuxtClient extends ThunderIDNodeClient<ThunderIDNuxtConfig> {
144168 return super . exchangeToken ( config , sessionId ) as unknown as Promise < TokenResponse | Response > ;
145169 }
146170
147- override async getUserProfile ( sessionId : string ) : Promise < UserProfile > {
148- const user : User = await this . getUser ( sessionId ) ;
149- return { flattenedProfile : user , profile : user } ;
171+ override async getUserProfile ( sessionId ?: string ) : Promise < UserProfile > {
172+ try {
173+ const configData : AuthClientConfig < ThunderIDNuxtConfig > = await this . getStorageManager ( ) . getConfigData ( ) ;
174+ const baseUrl : string | undefined = configData ?. baseUrl ;
175+
176+ const profile : User = await getUsersMe ( {
177+ baseUrl,
178+ url : resolveResourceEndpoint ( 'usersMe' , configData ) ,
179+ headers : {
180+ Authorization : `Bearer ${ await this . getAccessToken ( sessionId ) } ` ,
181+ } ,
182+ } ) ;
183+
184+ return {
185+ flattenedProfile : generateFlattenedUserProfile ( profile ) ,
186+ profile,
187+ } ;
188+ } catch ( error ) {
189+ return {
190+ flattenedProfile : extractUserClaimsFromIdToken ( await super . getDecodedIdToken ( sessionId ) ) ,
191+ profile : extractUserClaimsFromIdToken ( await super . getDecodedIdToken ( sessionId ) ) ,
192+ } ;
193+ }
194+ }
195+
196+ override async updateUserProfile ( payload : any , sessionId ?: string ) : Promise < User > {
197+ try {
198+ const configData : AuthClientConfig < ThunderIDNuxtConfig > = await this . getStorageManager ( ) . getConfigData ( ) ;
199+ const baseUrl : string | undefined = configData ?. baseUrl ;
200+
201+ return updateMeProfile ( {
202+ baseUrl,
203+ url : resolveResourceEndpoint ( 'usersMe' , configData ) ,
204+ headers : {
205+ Authorization : `Bearer ${ await this . getAccessToken ( sessionId ) } ` ,
206+ } ,
207+ payload : payload ?. payload ?? payload ,
208+ } ) ;
209+ } catch ( error ) {
210+ throw new ThunderIDRuntimeError (
211+ `Failed to update user profile: ${ error instanceof Error ? error . message : String ( error ) } ` ,
212+ 'ThunderIDNuxtClient-UpdateProfileError-001' ,
213+ 'nuxt' ,
214+ 'An error occurred while updating the user profile. Please check your configuration and network connection.' ,
215+ ) ;
216+ }
150217 }
151218
152- override async updateUserProfile ( config : UpdateMeProfileConfig , sessionId : string ) : Promise < User > {
153- throw new Error ( 'Profile updates are not supported for the ThunderID platform.' ) ;
219+ async getUserSchema ( sessionId ?: string ) : Promise < Record < string , AttributeSchema > | null > {
220+ const configData : AuthClientConfig < ThunderIDNuxtConfig > = await this . getStorageManager ( ) . getConfigData ( ) ;
221+ const baseUrl : string | undefined = configData ?. baseUrl ;
222+
223+ const metaRes = await getUsersMeMeta ( {
224+ baseUrl,
225+ url : resolveResourceEndpoint ( 'usersMeMeta' , configData ) ,
226+ headers : {
227+ Authorization : `Bearer ${ await this . getAccessToken ( sessionId ) } ` ,
228+ } ,
229+ } ) ;
230+
231+ return metaRes ?. schema ?? null ;
154232 }
155233
156234 public override getStorageManager ( ) : any {
0 commit comments