Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 0 additions & 7 deletions autoadmin-ws-server/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { config, validateConfig } from './config.js';
import { setupWebSocketServer } from './handlers/websocket.js';
import { logger } from './utils/logger.js';

// Validate configuration
try {
validateConfig();
} catch (error) {
Expand All @@ -16,7 +15,6 @@ try {

const app = createApp();

// Create HTTP server for Hono
const httpServer = serve({
fetch: app.fetch,
port: config.httpPort,
Expand All @@ -36,11 +34,9 @@ wsHttpServer.listen(config.wsPort, () => {
logger.info({ port: config.wsPort }, 'WebSocket server started');
});

// Graceful shutdown
const shutdown = (signal: string) => {
logger.info({ signal }, 'Shutdown signal received');

// Close WebSocket server
wss.close(() => {
logger.info('WebSocket server closed');
});
Expand All @@ -49,12 +45,10 @@ const shutdown = (signal: string) => {
logger.info('WebSocket HTTP server closed');
});

// Close HTTP server
httpServer.close(() => {
logger.info('HTTP server closed');
});

// Give connections time to close gracefully
setTimeout(() => {
logger.info('Forcing shutdown');
process.exit(0);
Expand All @@ -64,7 +58,6 @@ const shutdown = (signal: string) => {
process.on('SIGTERM', () => shutdown('SIGTERM'));
process.on('SIGINT', () => shutdown('SIGINT'));

// Handle uncaught errors
process.on('uncaughtException', (error) => {
logger.fatal({ error: error.message, stack: error.stack }, 'Uncaught exception');
process.exit(1);
Expand Down
2 changes: 1 addition & 1 deletion backend/_force-exit.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ import process from 'node:process';
import { registerCompletionHandler } from 'ava';

registerCompletionHandler(() => {
process.exit();
process.exit();
});
31 changes: 15 additions & 16 deletions backend/ava.config.mjs
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@

export default {
require: ['./_force-exit.mjs'],
files: ['test/ava-tests/**'],
typescript: {
extensions: ['ts'],
rewritePaths: {
'src/': 'dist/src/',
'test/': 'dist/test/',
},
compile: false,
},
workerThreads: false,
verbose: true,
timeout: '5m',
failFast: false,
concurrency: 3,
require: ['./_force-exit.mjs'],
files: ['test/ava-tests/**'],
typescript: {
extensions: ['ts'],
rewritePaths: {
'src/': 'dist/src/',
'test/': 'dist/test/',
},
compile: false,
},
workerThreads: false,
verbose: true,
timeout: '5m',
failFast: false,
concurrency: 3,
};
14 changes: 7 additions & 7 deletions backend/knip.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
{
"$schema": "https://unpkg.com/knip@5/schema.json",
"ignoreExportsUsedInFile": {
"interface": true,
"type": true
},
"ignore": ["src/migrations/**", "src/shared/config/datasource.config.ts", "src/enums/widget-type.enum.ts"],
"tags": ["-lintignore"]
"$schema": "https://unpkg.com/knip@5/schema.json",
"ignoreExportsUsedInFile": {
"interface": true,
"type": true
},
"ignore": ["src/migrations/**", "src/shared/config/datasource.config.ts", "src/enums/widget-type.enum.ts"],
"tags": ["-lintignore"]
}
12 changes: 6 additions & 6 deletions backend/nest-cli.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"monorepo": true,
"collection": "@nestjs/schematics",
"compilerOptions": {
"plugins": []
},
"sourceRoot": "src"
"monorepo": true,
"collection": "@nestjs/schematics",
"compilerOptions": {
"plugins": []
},
"sourceRoot": "src"
}
2 changes: 1 addition & 1 deletion backend/src/ai-core/ai-core.module.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Global, Module } from '@nestjs/common';
import { LangchainOpenAIProvider } from './providers/langchain-openai.provider.js';
import { LangchainBedrockProvider } from './providers/langchain-bedrock.provider.js';
import { LangchainOpenAIProvider } from './providers/langchain-openai.provider.js';
import { AICoreService } from './services/ai-core.service.js';

export const AI_CORE_SERVICE = 'AI_CORE_SERVICE';
Expand Down
3 changes: 1 addition & 2 deletions backend/src/ai-core/interfaces/ai-service.interface.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
import { BaseMessage } from '@langchain/core/messages';
import { IterableReadableStream } from '@langchain/core/utils/stream';
import {
AICompletionResult,
AIProviderConfig,
AIStreamChunk,
AIToolDefinition,
AIToolResult,
} from './ai-provider.interface.js';
import { IterableReadableStream } from '@langchain/core/utils/stream';

export enum AIProviderType {
OPENAI = 'openai',
BEDROCK = 'bedrock',
}

export interface IAIService {

complete(prompt: string, config?: AIProviderConfig): Promise<string>;

completeWithProvider(provider: AIProviderType, prompt: string, config?: AIProviderConfig): Promise<string>;
Expand Down
2 changes: 1 addition & 1 deletion backend/src/ai-core/providers/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
export * from './langchain-openai.provider.js';
export * from './langchain-bedrock.provider.js';
export * from './langchain-openai.provider.js';
12 changes: 6 additions & 6 deletions backend/src/ai-core/providers/langchain-bedrock.provider.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import { Injectable } from '@nestjs/common';
import { ChatBedrockConverse } from '@langchain/aws';
import { BaseMessage, AIMessage, AIMessageChunk, HumanMessage, ToolMessage } from '@langchain/core/messages';
import { IterableReadableStream } from '@langchain/core/utils/stream';
import { AIMessage, AIMessageChunk, BaseMessage, HumanMessage, ToolMessage } from '@langchain/core/messages';
import { tool } from '@langchain/core/tools';
import { IterableReadableStream } from '@langchain/core/utils/stream';
import { Injectable } from '@nestjs/common';
import { z } from 'zod';
import {
IAIProvider,
AIProviderConfig,
AICompletionResult,
AIProviderConfig,
AIStreamChunk,
AIToolCall,
AIToolDefinition,
AIToolResult,
AIToolCall,
IAIProvider,
} from '../interfaces/ai-provider.interface.js';

@Injectable()
Expand Down
18 changes: 9 additions & 9 deletions backend/src/ai-core/providers/langchain-openai.provider.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
import { Injectable } from '@nestjs/common';
import { ChatOpenAI } from '@langchain/openai';
import { BaseMessage, AIMessage, AIMessageChunk, HumanMessage, ToolMessage } from '@langchain/core/messages';
import { IterableReadableStream } from '@langchain/core/utils/stream';
import { AIMessage, AIMessageChunk, BaseMessage, HumanMessage, ToolMessage } from '@langchain/core/messages';
import { tool } from '@langchain/core/tools';
import { z } from 'zod';
import { IterableReadableStream } from '@langchain/core/utils/stream';
import { ChatOpenAI } from '@langchain/openai';
import { Injectable } from '@nestjs/common';
import OpenAI from 'openai';
import { z } from 'zod';
import { getOptionalEnvVariable, getRequiredEnvVariable } from '../../helpers/app/get-requeired-env-variable.js';
import {
IAIProvider,
AIProviderConfig,
AICompletionResult,
AIProviderConfig,
AIStreamChunk,
AIToolCall,
AIToolDefinition,
AIToolResult,
AIToolCall,
IAIProvider,
} from '../interfaces/ai-provider.interface.js';
import { getOptionalEnvVariable, getRequiredEnvVariable } from '../../helpers/app/get-requeired-env-variable.js';

@Injectable()
export class LangchainOpenAIProvider implements IAIProvider {
Expand Down
8 changes: 4 additions & 4 deletions backend/src/ai-core/services/ai-core.service.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import { Injectable } from '@nestjs/common';
import { BaseMessage } from '@langchain/core/messages';
import { IterableReadableStream } from '@langchain/core/utils/stream';
import { IAIService, AIProviderType } from '../interfaces/ai-service.interface.js';
import { Injectable } from '@nestjs/common';
import {
AIProviderConfig,
AICompletionResult,
AIProviderConfig,
AIStreamChunk,
AIToolDefinition,
AIToolResult,
IAIProvider,
} from '../interfaces/ai-provider.interface.js';
import { LangchainOpenAIProvider } from '../providers/langchain-openai.provider.js';
import { AIProviderType, IAIService } from '../interfaces/ai-service.interface.js';
import { LangchainBedrockProvider } from '../providers/langchain-bedrock.provider.js';
import { LangchainOpenAIProvider } from '../providers/langchain-openai.provider.js';

@Injectable()
export class AICoreService implements IAIService {
Expand Down
2 changes: 1 addition & 1 deletion backend/src/ai-core/utils/message-builder.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { HumanMessage, SystemMessage, AIMessage, ToolMessage, BaseMessage } from '@langchain/core/messages';
import { AIMessage, BaseMessage, HumanMessage, SystemMessage, ToolMessage } from '@langchain/core/messages';
import { AIToolCall } from '../interfaces/ai-provider.interface.js';

export class MessageBuilder {
Expand Down
13 changes: 6 additions & 7 deletions backend/src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { APP_GUARD } from '@nestjs/core';
import { ScheduleModule } from '@nestjs/schedule';
import { ThrottlerGuard, ThrottlerModule } from '@nestjs/throttler';
import { AppController } from './app.controller.js';
import { AICoreModule } from './ai-core/ai-core.module.js';
import { AppController } from './app.controller.js';
import { GlobalDatabaseContext } from './common/application/global-database-context.js';
import { BaseType, UseCaseType } from './common/data-injection.tokens.js';
import { AIModule } from './entities/ai/ai.module.js';
Expand Down Expand Up @@ -31,23 +31,22 @@ import { TableCategoriesModule } from './entities/table-categories/table-categor
import { TableFiltersModule } from './entities/table-filters/table-filters.module.js';
import { TableLogsModule } from './entities/table-logs/table-logs.module.js';
import { TableSettingsModule } from './entities/table-settings/common-table-settings/table-settings.module.js';
import { PersonalTableSettingsModule } from './entities/table-settings/personal-table-settings/personal-table-settings.module.js';
import { UserModule } from './entities/user/user.module.js';
import { UserActionModule } from './entities/user-actions/user-action.module.js';
import { UserSecretModule } from './entities/user-secret/user-secret.module.js';
import { SignInAuditModule } from './entities/user-sign-in-audit/sign-in-audit.module.js';
import { DashboardModule } from './entities/visualizations/dashboard/dashboards.module.js';
import { DashboardWidgetModule } from './entities/visualizations/dashboard-widget/dashboard-widget.module.js';
import { SavedDbQueryModule } from './entities/visualizations/saved-db-query/saved-db-query.module.js';
import { TableWidgetModule } from './entities/widget/table-widget.module.js';

import { SaaSGatewayModule } from './microservices/gateways/saas-gateway.ts/saas-gateway.module.js';
import { SaasModule } from './microservices/saas-microservice/saas.module.js';
import { AppLoggerMiddleware } from './middlewares/logging-middleware/app-logger-middlewate.js';
import { SelfHostedOperationsModule } from './selfhosted-operations/selhosted-operations.module.js';
import { DatabaseModule } from './shared/database/database.module.js';
import { SharedModule } from './shared/shared.module.js';
import { GetHelloUseCase } from './use-cases-app/get-hello.use.case.js';
import { PersonalTableSettingsModule } from './entities/table-settings/personal-table-settings/personal-table-settings.module.js';
import { SavedDbQueryModule } from './entities/visualizations/saved-db-query/saved-db-query.module.js';
import { DashboardModule } from './entities/visualizations/dashboard/dashboards.module.js';
import { DashboardWidgetModule } from './entities/visualizations/dashboard-widget/dashboard-widget.module.js';
import { SelfHostedOperationsModule } from './selfhosted-operations/selhosted-operations.module.js';

@Module({
imports: [
Expand Down
30 changes: 15 additions & 15 deletions backend/src/authorization/basic-auth.middleware.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
import { Injectable, NestMiddleware, UnauthorizedException } from '@nestjs/common';
import { Request, Response } from 'express';
import auth from 'basic-auth';
import { Request, Response } from 'express';
import { Messages } from '../exceptions/text/messages.js';

@Injectable()
export class BasicAuthMiddleware implements NestMiddleware {
use(req: Request, _res: Response, next: (err?: any, res?: any) => void): void {
const basicAuthLogin = process.env.BASIC_AUTH_LOGIN;
const basicAuthPassword = process.env.BASIC_AUTH_PWD;
const userCredentials = auth(req);
if (!userCredentials) {
throw new UnauthorizedException(Messages.AUTHORIZATION_REQUIRED);
}
const { name: loginUserName, pass: loginUserPassword } = userCredentials;
if (basicAuthLogin !== loginUserName || basicAuthPassword !== loginUserPassword) {
throw new UnauthorizedException(Messages.INVALID_USERNAME_OR_PASSWORD);
} else {
next();
}
}
use(req: Request, _res: Response, next: (err?: any, res?: any) => void): void {
const basicAuthLogin = process.env.BASIC_AUTH_LOGIN;
const basicAuthPassword = process.env.BASIC_AUTH_PWD;
const userCredentials = auth(req);
if (!userCredentials) {
throw new UnauthorizedException(Messages.AUTHORIZATION_REQUIRED);
}
const { name: loginUserName, pass: loginUserPassword } = userCredentials;
if (basicAuthLogin !== loginUserName || basicAuthPassword !== loginUserPassword) {
throw new UnauthorizedException(Messages.INVALID_USERNAME_OR_PASSWORD);
} else {
next();
}
}
}
30 changes: 15 additions & 15 deletions backend/src/authorization/cognito-decoded.interface.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
import type { Request } from 'express';
export interface ICognitoDecodedData {
at_hash: string;
sub: string;
aud: string | string[];
email_verified: boolean;
event_id: string;
token_use: string;
auth_time: number;
iss: string;
'cognito:username': string;
exp: number;
iat: number;
email: string;
at_hash: string;
sub: string;
aud: string | string[];
email_verified: boolean;
event_id: string;
token_use: string;
auth_time: number;
iss: string;
'cognito:username': string;
exp: number;
iat: number;
email: string;
}

export interface IRequestWithCognitoInfo extends Request {
query: any;
decoded: Partial<ICognitoDecodedData>;
params: any;
query: any;
decoded: Partial<ICognitoDecodedData>;
params: any;
}
Loading
Loading