feat: add CASL authorization and AI configuration

This commit is contained in:
2026-07-11 14:25:34 +08:00
parent 8f0991a51f
commit 1e1c476bc3
59 changed files with 7733 additions and 120 deletions

View File

@@ -2,7 +2,7 @@ import { Module } from '@nestjs/common';
import { APP_GUARD } from '@nestjs/core';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { EventEmitterModule } from '@nestjs/event-emitter';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TypeOrmModule, type TypeOrmModuleOptions } from '@nestjs/typeorm';
import { ThrottlerModule, ThrottlerGuard } from '@nestjs/throttler';
import {
Student,
@@ -40,11 +40,14 @@ import {
ResultArchive,
ArchiveAttachment,
StudentDingMapping,
AiConfig,
} from './entities';
import { AuthModule } from './auth/auth.module';
import { AuthorizationModule } from './authorization';
import { RbacModule } from './rbac/rbac.module';
import { StudentsModule } from './students/students.module';
import { PermissionGuard } from './auth/guards/permission.guard';
import { PoliciesGuard } from './authorization/guards/policies.guard';
import { JwtAuthGuard } from './auth/guards/jwt-auth.guard';
import { RoomsModule } from './rooms/rooms.module';
import { OccupanciesModule } from './occupancies/occupancies.module';
@@ -64,6 +67,8 @@ import { NotificationsModule } from './notifications/notifications.module';
import { ArchiveModule } from './archive/archive.module';
import { ExpenseTypesModule } from './expense-types/expense-types.module';
import { DatabaseMigrationsModule } from './database/database-migrations.module';
import { AgentToolsModule } from './agent-tools';
import { AiConfigModule } from './ai-config/ai-config.module';
import {
IntegrationConfig,
@@ -73,6 +78,7 @@ import { IntegrationConfigModule } from './integration/config/config.module';
@Module({
imports: [
AuthorizationModule,
ConfigModule.forRoot({ isGlobal: true }),
ThrottlerModule.forRoot([
{
@@ -84,7 +90,7 @@ import { IntegrationConfigModule } from './integration/config/config.module';
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (config: ConfigService): any => {
useFactory: (config: ConfigService): TypeOrmModuleOptions => {
const dbType = config.get('DB_TYPE', 'sqlite');
const allEntities = [
Student,
@@ -124,6 +130,7 @@ import { IntegrationConfigModule } from './integration/config/config.module';
StudentDingMapping,
IntegrationConfig,
IntegrationConfigDetail,
AiConfig,
];
if (dbType === 'mysql') {
return {
@@ -131,8 +138,8 @@ import { IntegrationConfigModule } from './integration/config/config.module';
host: config.get('DB_HOST', 'localhost'),
port: config.get<number>('DB_PORT', 3306),
username: config.get('DB_USERNAME', 'root'),
password: config.get('DB_PASSWORD', ''),
database: config.get('DB_DATABASE', 'dorm_billing'),
password: config.get<string>('DB_PASSWORD', ''),
database: config.get<string>('DB_DATABASE', 'dorm_billing'),
entities: allEntities,
synchronize: config.get('DB_SYNCHRONIZE', 'true') !== 'false',
charset: 'utf8mb4',
@@ -140,7 +147,7 @@ import { IntegrationConfigModule } from './integration/config/config.module';
}
return {
type: 'better-sqlite3' as const,
database: config.get('DB_DATABASE', 'dorm_billing.db'),
database: config.get<string>('DB_DATABASE', 'dorm_billing.db'),
entities: allEntities,
synchronize: config.get('DB_SYNCHRONIZE', 'true') !== 'false',
};
@@ -167,12 +174,15 @@ import { IntegrationConfigModule } from './integration/config/config.module';
NotificationsModule,
ArchiveModule,
IntegrationConfigModule,
AgentToolsModule,
ExpenseTypesModule,
AiConfigModule,
],
providers: [
{ provide: APP_GUARD, useClass: ThrottlerGuard },
{ provide: APP_GUARD, useClass: JwtAuthGuard },
{ provide: APP_GUARD, useClass: PermissionGuard },
{ provide: APP_GUARD, useClass: PoliciesGuard },
],
})
export class AppModule {}