mirror of
https://github.com/Gimanh/taskview-community.git
synced 2026-09-11 21:38:56 +00:00
67 lines
2.4 KiB
TypeScript
67 lines
2.4 KiB
TypeScript
import type { LoginMethod } from '../../types/auth.types';
|
|
|
|
export class LoginMethods {
|
|
static readonly ALL: LoginMethod[] = ['magic-link', 'password', 'sso', 'social'];
|
|
|
|
static enabled(): Set<LoginMethod> {
|
|
const raw = process.env.AUTH_LOGIN_METHODS;
|
|
if (!raw || !raw.trim()) {
|
|
return new Set(LoginMethods.ALL);
|
|
}
|
|
return new Set(LoginMethods.parse(raw).valid);
|
|
}
|
|
|
|
static isEnabled(method: LoginMethod): boolean {
|
|
return LoginMethods.enabled().has(method);
|
|
}
|
|
|
|
static validateOnStartup(): void {
|
|
const raw = process.env.AUTH_LOGIN_METHODS;
|
|
if (!raw || !raw.trim()) return;
|
|
|
|
const { valid, invalid } = LoginMethods.parse(raw);
|
|
if (invalid.length > 0) {
|
|
throw new Error(
|
|
`AUTH_LOGIN_METHODS contains unknown values: ${invalid.join(', ')}. Allowed: ${LoginMethods.ALL.join(', ')}`
|
|
);
|
|
}
|
|
if (valid.length === 0) {
|
|
throw new Error('AUTH_LOGIN_METHODS disables every login method — nobody would be able to sign in');
|
|
}
|
|
}
|
|
|
|
static configuredSocialProviders(): string[] {
|
|
const providers: string[] = [];
|
|
if (process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET && process.env.GOOGLE_CALLBACK_URL) {
|
|
providers.push('google');
|
|
}
|
|
if (process.env.GITHUB_CLIENT_ID && process.env.GITHUB_CLIENT_SECRET && process.env.GITHUB_CALLBACK_URL) {
|
|
providers.push('github');
|
|
}
|
|
if (
|
|
process.env.APPLE_CLIENT_ID &&
|
|
process.env.APPLE_TEAM_ID &&
|
|
process.env.APPLE_KEY_ID &&
|
|
process.env.APPLE_CALLBACK_URL &&
|
|
process.env.APPLE_KEY_LOCATION
|
|
) {
|
|
providers.push('apple');
|
|
}
|
|
return providers;
|
|
}
|
|
|
|
static availableSocialProviders(): string[] {
|
|
return LoginMethods.isEnabled('social') ? LoginMethods.configuredSocialProviders() : [];
|
|
}
|
|
|
|
private static parse(raw: string): { valid: LoginMethod[]; invalid: string[] } {
|
|
const values = raw
|
|
.split(',')
|
|
.map((value) => value.trim().toLowerCase())
|
|
.filter(Boolean);
|
|
const valid = values.filter((value): value is LoginMethod => (LoginMethods.ALL as string[]).includes(value));
|
|
const invalid = values.filter((value) => !(LoginMethods.ALL as string[]).includes(value));
|
|
return { valid, invalid };
|
|
}
|
|
}
|