import {Awaitable, hasOwnProperty, Maybe} from '../../util' export enum OAuth2FlowType { code = 'code', } // export const oauth2FlowTypes: OAuth2FlowType[] = Object.entries(OAuth2FlowType).map(([_, value]) => value) export function isOAuth2FlowType(what: unknown): what is OAuth2FlowType { return [OAuth2FlowType.code].includes(what as any) } export interface OAuth2Client { id: string display: string secret: string allowedFlows: OAuth2FlowType[] allowedScopeIds: string[] allowedRedirectUris: string[] } export function isOAuth2Client(what: unknown): what is OAuth2Client { if ( typeof what !== 'object' || what === null ) { return false } if ( !hasOwnProperty(what, 'id') || !hasOwnProperty(what, 'display') || !hasOwnProperty(what, 'secret') || !hasOwnProperty(what, 'allowedFlows') || !hasOwnProperty(what, 'allowedScopeIds') || !hasOwnProperty(what, 'allowedRedirectUris') ) { return false } if ( typeof what.id !== 'string' || typeof what.display !== 'string' || typeof what.secret !== 'string' ) { return false } if ( !Array.isArray(what.allowedScopeIds) || !what.allowedScopeIds.every(x => typeof x === 'string') ) { return false } if ( !Array.isArray(what.allowedRedirectUris) || !what.allowedRedirectUris.every(x => typeof x === 'string') ) { return false } return !(!Array.isArray(what.allowedFlows) || !what.allowedFlows.every(x => isOAuth2FlowType(x))) } export abstract class ClientRepository { abstract find(id: string): Awaitable> } export interface OAuth2Scope { id: string name: string description?: string } export function isOAuth2Scope(what: unknown): what is OAuth2Scope { if ( typeof what !== 'object' || what === null ) { return false } if ( !hasOwnProperty(what, 'id') || !hasOwnProperty(what, 'name') ) { return false } if ( typeof what.id !== 'string' || typeof what.name !== 'string' ) { return false } return !hasOwnProperty(what, 'description') || typeof what.description === 'string' } export abstract class ScopeRepository { abstract find(id: string): Awaitable> abstract findByName(name: string): Awaitable> }