import { AccountsClient , TransportInterface } from '@accounts/client' ; import { CreateUser , ImpersonationResult , LoginResult , User , CreateUserResult , } from '@accounts/types' ; import { print , DocumentNode } from 'graphql/language' ; import { TypedDocumentNode } from '@graphql-typed-document-node/core' ; import { CreateUserDocument , AddEmailDocument , AuthenticateWithServiceDocument , GetTwoFactorSecretDocument , ChangePasswordDocument , LogoutDocument , VerifyEmailDocument , SendResetPasswordEmailDocument , SendVerificationEmailDocument , ResetPasswordDocument , TwoFactorSetDocument , TwoFactorUnsetDocument , RefreshTokensDocument , GetUserDocument , ImpersonateDocument , AuthenticateDocument , RequestMagicLinkEmailDocument , } from './graphql-operations' ; import { GraphQLErrorList } from './GraphQLErrorList' ; import { replaceUserFieldsFragment } from './utils/replace-user-fragment' ; export interface AuthenticateParams { [ key ] : string | object ; } export interface OptionsType { graphQLClient : any ; userFieldsFragment ? : DocumentNode ; } export default class GraphQLClient implements TransportInterface { public client ! : AccountsClient ; private options : OptionsType ; constructor ( options ) { this . options = options ; } param { CreateUser } user returns { Promise < CreateUserResult > } memberof public async createUser ( user ) { return this . mutate ( this . options . userFieldsFragment ? replaceUserFieldsFragment ( CreateUserDocument , this . options . userFieldsFragment ) : CreateUserDocument , 'createUser' , { user } ) ; } inheritDoc public async authenticateWithService ( service , authenticateParams ) { return this . mutate ( AuthenticateWithServiceDocument , 'verifyAuthentication' , { serviceName : service , params : authenticateParams , } ) ; } inheritDoc public async loginWithService ( service , authenticateParams ) { return this . mutate ( this . options . userFieldsFragment ? replaceUserFieldsFragment ( AuthenticateDocument , this . options . userFieldsFragment ) : AuthenticateDocument , 'authenticate' , { serviceName : service , params : authenticateParams , } ) ; } inheritDoc public async getUser ( ) { return this . query ( this . options . userFieldsFragment ? replaceUserFieldsFragment ( GetUserDocument , this . options . userFieldsFragment ) : GetUserDocument , 'getUser' ) ; } inheritDoc public async logout ( ) { return this . mutate ( LogoutDocument , 'logout' ) ; } inheritDoc public async refreshTokens ( accessToken , refreshToken ) { return this . mutate ( RefreshTokensDocument , 'refreshTokens' , { accessToken , refreshToken } ) ; } inheritDoc public async verifyEmail ( token ) { return this . mutate ( VerifyEmailDocument , 'verifyEmail' , { token } ) ; } inheritDoc public async sendResetPasswordEmail ( email ) { return this . mutate ( SendResetPasswordEmailDocument , 'sendResetPasswordEmail' , { email } ) ; } inheritDoc public async sendVerificationEmail ( email ) { return this . mutate ( SendVerificationEmailDocument , 'sendVerificationEmail' , { email } ) ; } inheritDoc public async resetPassword ( token , newPassword ) { return this . mutate ( ResetPasswordDocument , 'resetPassword' , { token , newPassword } ) ; } inheritDoc public async addEmail ( newEmail ) { return this . mutate ( AddEmailDocument , 'addEmail' , { newEmail } ) ; } inheritDoc public async changePassword ( oldPassword , newPassword ) { return this . mutate ( ChangePasswordDocument , 'changePassword' , { oldPassword , newPassword } ) ; } inheritDoc public async getTwoFactorSecret ( ) { return this . query ( GetTwoFactorSecretDocument , 'twoFactorSecret' , { } ) ; } inheritDoc public async twoFactorSet ( secret , code ) { return this . mutate ( TwoFactorSetDocument , 'twoFactorSet' , { secret , code } ) ; } inheritDoc public async twoFactorUnset ( code ) { return this . mutate ( TwoFactorUnsetDocument , 'twoFactorUnset' , { code } ) ; } inheritDoc public async impersonate ( token , impersonated ) { return this . mutate ( this . options . userFieldsFragment ? replaceUserFieldsFragment ( ImpersonateDocument , this . options . userFieldsFragment ) : ImpersonateDocument , 'impersonate' , { accessToken : token , impersonated : { userId : impersonated . userId , username : impersonated . username , email : impersonated . email , } , } ) ; } private async mutate < TData = any , TVariables = Record < string , any > > ( mutation , resultField , variables ? ) { const tokens = ( mutation as any ) === RefreshTokensDocument ? await this . client . getTokens ( ) : await this . client . refreshSession ( ) ; const headers = { } ; if ( tokens ) { headers . Authorization = `Bearer ${ tokens . accessToken }` ; } const { data , errors } = await this . options . graphQLClient . mutate ( { mutation , variables , context : { headers , } , } ) ; if ( errors ) { throw new GraphQLErrorList ( errors , `in mutation: \r\n ${ print ( mutation ) }` ) ; } return data [ resultField ] ; } private async query < TData = any , TVariables = Record < string , any > > ( query , resultField , variables ? ) { const tokens = await this . client . refreshSession ( ) ; const headers = { } ; if ( tokens ) { headers . Authorization = `Bearer ${ tokens . accessToken }` ; } const { data , errors } = await this . options . graphQLClient . query ( { query , variables , fetchPolicy : 'network-only' , context : { headers , } , } ) ; if ( errors ) { throw new GraphQLErrorList ( errors , `in query: \r\n ${ print ( query ) }` ) ; } return data [ resultField ] ; } inheritDoc public async requestMagicLinkEmail ( email ) { return this . mutate ( RequestMagicLinkEmailDocument , 'requestMagicLinkEmail' , { email } ) ; } }