refactor(server): config system (#11081)

This commit is contained in:
forehalo
2025-03-27 12:32:28 +00:00
parent 7091111f85
commit 0ea38680fa
274 changed files with 7583 additions and 5841 deletions
@@ -1,4 +1,8 @@
import { Inject, Injectable, Logger } from '@nestjs/common';
import { Config, OnEvent } from '../../../base';
import { OAuthProviderName } from '../config';
import { OAuthProviderFactory } from '../factory';
export interface OAuthAccount {
id: string;
@@ -13,9 +17,42 @@ export interface Tokens {
expiresAt?: Date;
}
@Injectable()
export abstract class OAuthProvider {
abstract provider: OAuthProviderName;
abstract getAuthUrl(state: string): string;
abstract getToken(code: string): Promise<Tokens>;
abstract getUser(token: string): Promise<OAuthAccount>;
protected readonly logger = new Logger(this.constructor.name);
@Inject() private readonly factory!: OAuthProviderFactory;
@Inject() private readonly AFFiNEConfig!: Config;
get config() {
return this.AFFiNEConfig.oauth.providers[this.provider];
}
get configured() {
return this.config && this.config.clientId && this.config.clientSecret;
}
@OnEvent('config.init')
onConfigInit() {
this.setup();
}
@OnEvent('config.changed')
onConfigUpdated(event: Events['config.changed']) {
if ('oauth' in event.updates) {
this.setup();
}
}
protected setup() {
if (this.configured) {
this.factory.register(this);
} else {
this.factory.unregister(this);
}
}
}
@@ -1,8 +1,8 @@
import { Injectable } from '@nestjs/common';
import { Config, InvalidOauthCallbackCode, URLHelper } from '../../../base';
import { InvalidOauthCallbackCode, URLHelper } from '../../../base';
import { OAuthProviderName } from '../config';
import { AutoRegisteredOAuthProvider } from '../register';
import { OAuthProvider } from './def';
interface AuthTokenResponse {
access_token: string;
@@ -18,13 +18,10 @@ export interface UserInfo {
}
@Injectable()
export class GithubOAuthProvider extends AutoRegisteredOAuthProvider {
export class GithubOAuthProvider extends OAuthProvider {
provider = OAuthProviderName.GitHub;
constructor(
protected readonly AFFiNEConfig: Config,
private readonly url: URLHelper
) {
constructor(private readonly url: URLHelper) {
super();
}
@@ -1,8 +1,8 @@
import { Injectable } from '@nestjs/common';
import { Config, InvalidOauthCallbackCode, URLHelper } from '../../../base';
import { InvalidOauthCallbackCode, URLHelper } from '../../../base';
import { OAuthProviderName } from '../config';
import { AutoRegisteredOAuthProvider } from '../register';
import { OAuthProvider } from './def';
interface GoogleOAuthTokenResponse {
access_token: string;
@@ -20,13 +20,10 @@ export interface UserInfo {
}
@Injectable()
export class GoogleOAuthProvider extends AutoRegisteredOAuthProvider {
export class GoogleOAuthProvider extends OAuthProvider {
override provider = OAuthProviderName.Google;
constructor(
protected readonly AFFiNEConfig: Config,
private readonly url: URLHelper
) {
constructor(private readonly url: URLHelper) {
super();
}
@@ -1,14 +1,13 @@
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
import { Injectable, Logger } from '@nestjs/common';
import { z } from 'zod';
import { Config, URLHelper } from '../../../base';
import { URLHelper } from '../../../base';
import {
OAuthOIDCProviderConfig,
OAuthProviderName,
OIDCArgs,
} from '../config';
import { AutoRegisteredOAuthProvider } from '../register';
import { OAuthAccount, Tokens } from './def';
import { OAuthAccount, OAuthProvider, Tokens } from './def';
const OIDCTokenSchema = z.object({
access_token: z.string(),
@@ -163,26 +162,26 @@ class OIDCClient {
}
@Injectable()
export class OIDCProvider
extends AutoRegisteredOAuthProvider
implements OnModuleInit
{
export class OIDCProvider extends OAuthProvider {
override provider = OAuthProviderName.OIDC;
private client: OIDCClient | null = null;
constructor(
protected readonly AFFiNEConfig: Config,
private readonly url: URLHelper
) {
constructor(private readonly url: URLHelper) {
super();
}
// eslint-disable-next-line @typescript-eslint/no-misused-promises
override async onModuleInit() {
const config = this.optionalConfig as OAuthOIDCProviderConfig;
if (config && config.issuer && config.clientId && config.clientSecret) {
this.client = await OIDCClient.create(config, this.url);
super.onModuleInit();
protected override setup() {
super.setup();
if (this.configured) {
OIDCClient.create(this.config as OAuthOIDCProviderConfig, this.url)
.then(client => {
this.client = client;
})
.catch(e => {
this.logger.error('Failed to create OIDC client', e);
});
} else {
this.client = null;
}
}