60 lines
2.0 KiB
TypeScript
60 lines
2.0 KiB
TypeScript
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
|
|
import {
|
|
WECOM_PLUGIN_PERMISSIONS,
|
|
parseWecomPluginPermissions,
|
|
type WecomPluginPermission,
|
|
} from '@dukang/shared-types';
|
|
import { isWecomPluginEnabled, matchWecomPluginByApiKey } from '@dukang/domain';
|
|
import { PrismaService } from '../../common/prisma/prisma.module';
|
|
import type { WecomPluginRuntime } from './wecom-plugin.types';
|
|
|
|
@Injectable()
|
|
export class WecomPluginAuthService implements OnModuleInit {
|
|
private readonly logger = new Logger(WecomPluginAuthService.name);
|
|
|
|
constructor(private readonly prisma: PrismaService) {}
|
|
|
|
async onModuleInit() {
|
|
await this.migrateFromEnv().catch((e) => {
|
|
this.logger.warn(
|
|
`wecom plugin env migrate skipped: ${e instanceof Error ? e.message : String(e)}`,
|
|
);
|
|
});
|
|
}
|
|
|
|
async resolveByApiKey(provided: string): Promise<WecomPluginRuntime | null> {
|
|
const key = String(provided ?? '').trim();
|
|
if (!key) return null;
|
|
const rows = await this.prisma.wecomApiPlugin.findMany({
|
|
where: { enabled: true },
|
|
select: { id: true, name: true, apiKey: true, permissions: true },
|
|
});
|
|
const hit = matchWecomPluginByApiKey(key, rows);
|
|
if (!hit) return null;
|
|
return {
|
|
id: hit.id.toString(),
|
|
name: hit.name,
|
|
permissions: parseWecomPluginPermissions(hit.permissions),
|
|
};
|
|
}
|
|
|
|
private async migrateFromEnv() {
|
|
if (!isWecomPluginEnabled(process.env)) return;
|
|
const count = await this.prisma.wecomApiPlugin.count();
|
|
if (count > 0) return;
|
|
const apiKey = String(process.env.WECOM_PLUGIN_API_KEY ?? '').trim();
|
|
if (!apiKey) return;
|
|
await this.prisma.wecomApiPlugin.create({
|
|
data: {
|
|
name: '迁移自 env',
|
|
apiKey,
|
|
permissions: JSON.stringify([...WECOM_PLUGIN_PERMISSIONS] as WecomPluginPermission[]),
|
|
remark: '由 WECOM_PLUGIN_API_KEY 一次性导入',
|
|
enabled: true,
|
|
sortOrder: 0,
|
|
},
|
|
});
|
|
this.logger.log('wecom api plugin migrated from env');
|
|
}
|
|
}
|