mirror of
https://github.com/farcasclaudiu/Flowise.git
synced 2026-06-25 05:00:55 +03:00
bf05f25f7e
* common pagination component * Pagination for Doc Store Dashboard * Pagination for Executions Dashboard * Pagination Support for Tables * lint fixes * update view message dialog UI * initial loading was ignoring the pagination counts * 1) default page size change 2) ensure page limits are passed on load 3) co-pilot review comments (n+1 query) 4) * 1) default page size change 2) ensure page limits are passed on load 3) co-pilot review comments (n+1 query) 4) refresh lists after insert/delete. * Enhancement: Improve handling of empty responses in DocumentStore and API key services - Added check for empty entities in DocumentStoreDTO.fromEntities to return an empty array. - Updated condition in getAllDocumentStores to handle total count correctly, allowing for zero total. - Refined logic in getAllApiKeys to check for empty keys and ensure correct API key retrieval. - Adjusted UI components to safely handle potential undefined apiKeys array. * Refresh API key list on pagination change * Enhancement: Update pagination and filter handling across components - Increased default items per page in AgentExecutions from 10 to 12. - Improved JSON parsing for chat type and feedback type filters in ViewMessagesDialog. - Enhanced execution filtering logic in AgentExecutions to ensure proper pagination and state management. - Refactored filter section in AgentExecutions for better readability and functionality. - Updated refresh logic in Agentflows to use the correct agentflow version. * add workspaceId to removeAllChatMessages * Refactor chat message retrieval logic for improved efficiency and maintainability - Introduced a new `handleFeedbackQuery` function to streamline feedback-related queries. - Enhanced pagination handling for session-based queries in `getMessagesWithFeedback`. - Updated `ViewMessagesDialog` to sort messages in descending order by default. - Simplified image rendering logic in `DocumentStoreTable` for better readability. * - Update `validateChatflowAPIKey` and `validateAPIKey` functions to get the correct keys array - Enhanced error handling in the `sanitizeExecution` function to ensure safe access to nested properties * Refactor API key validation logic for improved accuracy and error handling - Consolidated API key validation in `validateAPIKey` to return detailed validation results. - Updated `validateFlowAPIKey` to streamline flow API key validation. - Introduced `getApiKeyById` function in the API key service for better key retrieval. - Removed unused function `getAllChatSessionsFromChatflow` from the chat message API. --------- Co-authored-by: Henry <hzj94@hotmail.com>
69 lines
2.4 KiB
TypeScript
69 lines
2.4 KiB
TypeScript
import { Request } from 'express'
|
|
import { ChatFlow } from '../database/entities/ChatFlow'
|
|
import { ApiKey } from '../database/entities/ApiKey'
|
|
import { compareKeys } from './apiKey'
|
|
import apikeyService from '../services/apikey'
|
|
|
|
/**
|
|
* Validate flow API Key, this is needed because Prediction/Upsert API is public
|
|
* @param {Request} req
|
|
* @param {ChatFlow} chatflow
|
|
*/
|
|
export const validateFlowAPIKey = async (req: Request, chatflow: ChatFlow): Promise<boolean> => {
|
|
const chatFlowApiKeyId = chatflow?.apikeyid
|
|
if (!chatFlowApiKeyId) return true
|
|
|
|
const authorizationHeader = (req.headers['Authorization'] as string) ?? (req.headers['authorization'] as string) ?? ''
|
|
if (chatFlowApiKeyId && !authorizationHeader) return false
|
|
|
|
const suppliedKey = authorizationHeader.split(`Bearer `).pop()
|
|
if (!suppliedKey) return false
|
|
|
|
try {
|
|
const apiKey = await apikeyService.getApiKeyById(chatFlowApiKeyId)
|
|
if (!apiKey) return false
|
|
|
|
const apiKeyWorkSpaceId = apiKey.workspaceId
|
|
if (!apiKeyWorkSpaceId) return false
|
|
|
|
if (apiKeyWorkSpaceId !== chatflow.workspaceId) return false
|
|
|
|
const apiSecret = apiKey.apiSecret
|
|
if (!apiSecret || !compareKeys(apiSecret, suppliedKey)) return false
|
|
|
|
return true
|
|
} catch (error) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Validate and Get API Key Information
|
|
* @param {Request} req
|
|
* @returns {Promise<{isValid: boolean, apiKey?: ApiKey, workspaceId?: string}>}
|
|
*/
|
|
export const validateAPIKey = async (req: Request): Promise<{ isValid: boolean; apiKey?: ApiKey; workspaceId?: string }> => {
|
|
const authorizationHeader = (req.headers['Authorization'] as string) ?? (req.headers['authorization'] as string) ?? ''
|
|
if (!authorizationHeader) return { isValid: false }
|
|
|
|
const suppliedKey = authorizationHeader.split(`Bearer `).pop()
|
|
if (!suppliedKey) return { isValid: false }
|
|
|
|
try {
|
|
const apiKey = await apikeyService.getApiKey(suppliedKey)
|
|
if (!apiKey) return { isValid: false }
|
|
|
|
const apiKeyWorkSpaceId = apiKey.workspaceId
|
|
if (!apiKeyWorkSpaceId) return { isValid: false }
|
|
|
|
const apiSecret = apiKey.apiSecret
|
|
if (!apiSecret || !compareKeys(apiSecret, suppliedKey)) {
|
|
return { isValid: false, apiKey, workspaceId: apiKey.workspaceId }
|
|
}
|
|
|
|
return { isValid: true, apiKey, workspaceId: apiKey.workspaceId }
|
|
} catch (error) {
|
|
return { isValid: false }
|
|
}
|
|
}
|