mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-22 14:46:41 +02:00
- bot-services: Add registerAsync to AI, Calendar, Clock, Todo modules - bot-services: Add convenience methods to ClockService for bot handlers - bot-services: Make CreateEventInput.endTime optional with sensible defaults - bot-services: Fix empty interface ESLint errors (use type aliases) - questions-backend: Add missing schema columns (isDefault, sortOrder, deletedAt) - questions-backend: Fix or() return type handling in question service - questions-web: Add guard for undefined question ID in route params - skilltree-web: Fix DBSchema type by not extending idb interface directly - calendar-web: Fix Check icon prop (use weight instead of strokeWidth) - matrix-mana-bot: Update clock handler to use new service methods Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
75 lines
1.7 KiB
TypeScript
75 lines
1.7 KiB
TypeScript
import { Module, DynamicModule, Provider, Type, ModuleMetadata } from '@nestjs/common';
|
|
import { AiService } from './ai.service';
|
|
import { AiServiceConfig } from './types';
|
|
|
|
export type AiModuleOptions = Partial<AiServiceConfig>;
|
|
|
|
export interface AiModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
|
|
useFactory: (...args: unknown[]) => Promise<AiModuleOptions> | AiModuleOptions;
|
|
inject?: (Type<unknown> | string | symbol)[];
|
|
}
|
|
|
|
@Module({})
|
|
export class AiModule {
|
|
/**
|
|
* Register with default configuration (uses environment variables)
|
|
*/
|
|
static register(options?: AiModuleOptions): DynamicModule {
|
|
return {
|
|
module: AiModule,
|
|
providers: [
|
|
{
|
|
provide: 'AI_SERVICE_CONFIG',
|
|
useValue: options ?? {},
|
|
},
|
|
{
|
|
provide: AiService,
|
|
useFactory: (config: Partial<AiServiceConfig>) => new AiService(config),
|
|
inject: ['AI_SERVICE_CONFIG'],
|
|
},
|
|
],
|
|
exports: [AiService],
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Register with explicit configuration
|
|
*/
|
|
static forRoot(config: AiServiceConfig): DynamicModule {
|
|
return {
|
|
module: AiModule,
|
|
providers: [
|
|
{
|
|
provide: AiService,
|
|
useFactory: () => new AiService(config),
|
|
},
|
|
],
|
|
exports: [AiService],
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Register asynchronously with factory function
|
|
*/
|
|
static registerAsync(options: AiModuleAsyncOptions): DynamicModule {
|
|
const configProvider: Provider = {
|
|
provide: 'AI_SERVICE_CONFIG',
|
|
useFactory: options.useFactory,
|
|
inject: options.inject || [],
|
|
};
|
|
|
|
return {
|
|
module: AiModule,
|
|
imports: options.imports || [],
|
|
providers: [
|
|
configProvider,
|
|
{
|
|
provide: AiService,
|
|
useFactory: (config: Partial<AiServiceConfig>) => new AiService(config),
|
|
inject: ['AI_SERVICE_CONFIG'],
|
|
},
|
|
],
|
|
exports: [AiService],
|
|
};
|
|
}
|
|
}
|