import {Authenticatable, AuthenticatableIdentifier} from '../../types' import {OAuth2LoginConfig} from './OAuth2LoginController' import {Awaitable, dataGetUnsafe, InvalidJSONStateError, JSONState} from '../../../util' export class OAuth2User implements Authenticatable { protected displayField: string protected identifierField: string constructor( protected data: {[key: string]: any}, config: OAuth2LoginConfig, ) { this.displayField = config.userEndpointResponseMapping?.display || 'name' this.identifierField = config.userEndpointResponseMapping?.identifier || 'id' } getDisplayIdentifier(): string { return String(dataGetUnsafe(this.data, this.displayField || 'name', '')) } getIdentifier(): AuthenticatableIdentifier { return String(dataGetUnsafe(this.data, this.identifierField || 'id', '')) } async dehydrate(): Promise { return { isOAuth2User: true, data: this.data, displayField: this.displayField, identifierField: this.identifierField, } } rehydrate(state: JSONState): Awaitable { if ( !state.isOAuth2User || typeof state.data !== 'object' || state.data === null || typeof state.displayField !== 'string' || typeof state.identifierField !== 'string' ) { throw new InvalidJSONStateError('OAuth2User state is invalid', { state }) } this.data = state.data this.identifierField = state.identifierField this.displayField = state.identifierField } }