import { Injectable } from '@nestjs/common'; export abstract class AuthProviderAbstract { abstract generateLink(query?: any): Promise | string; abstract getToken(code: string, redirectUri?: string): Promise; abstract getUser( providerToken: string ): Promise<{ email: string; id: string }> | false; async postRegistration( providerToken: string, orgId: string ): Promise {} } export interface AuthProviderParams { provider: string; } export function AuthProvider(params: AuthProviderParams) { return function (target: any) { Injectable()(target); const existingMetadata = Reflect.getMetadata('auth-provider', AuthProviderAbstract) || []; existingMetadata.push({ target, provider: params.provider }); Reflect.defineMetadata( 'auth-provider', existingMetadata, AuthProviderAbstract ); }; }