Files
Flowise/packages/server/src/utils/fileRepository.ts
T
Henry Heng 5a37227d14 Chore/refractor (#4454)
* markdown files and env examples cleanup

* components update

* update jsonlines description

* server refractor

* update telemetry

* add execute custom node

* add ui refractor

* add username and password authenticate

* correctly retrieve past images in agentflowv2

* disable e2e temporarily

* add existing username and password authenticate

* update migration to default workspace

* update todo

* blob storage migrating

* throw error on agent tool call error

* add missing execution import

* add referral

* chore: add error message when importData is undefined

* migrate api keys to db

* fix: data too long for column executionData

* migrate api keys from json to db at init

* add info on account setup

* update docstore missing fields

---------

Co-authored-by: chungyau97 <chungyau97@gmail.com>
2025-05-27 07:29:42 +01:00

111 lines
4.3 KiB
TypeScript

import { ChatFlow } from '../database/entities/ChatFlow'
import { IReactFlowObject } from '../Interface'
import { addBase64FilesToStorage } from 'flowise-components'
import { checkStorage, updateStorageUsage } from './quotaUsage'
import { UsageCacheManager } from '../UsageCacheManager'
export const containsBase64File = (chatflow: ChatFlow) => {
const parsedFlowData: IReactFlowObject = JSON.parse(chatflow.flowData)
const re = new RegExp('^data.*;base64', 'i')
let found = false
const nodes = parsedFlowData.nodes
for (const node of nodes) {
if (node.data.category !== 'Document Loaders') {
continue
}
const inputs = node.data.inputs
if (inputs) {
const keys = Object.getOwnPropertyNames(inputs)
for (let i = 0; i < keys.length; i++) {
const input = inputs[keys[i]]
if (!input) {
continue
}
if (typeof input !== 'string') {
continue
}
if (input.startsWith('[')) {
try {
const files = JSON.parse(input)
for (let j = 0; j < files.length; j++) {
const file = files[j]
if (re.test(file)) {
found = true
break
}
}
} catch (e) {
continue
}
}
if (re.test(input)) {
found = true
break
}
}
}
}
return found
}
export const updateFlowDataWithFilePaths = async (
chatflowid: string,
flowData: string,
orgId: string,
workspaceId: string,
subscriptionId: string,
usageCacheManager: UsageCacheManager
) => {
try {
const parsedFlowData: IReactFlowObject = JSON.parse(flowData)
const re = new RegExp('^data.*;base64', 'i')
const nodes = parsedFlowData.nodes
for (let j = 0; j < nodes.length; j++) {
const node = nodes[j]
if (node.data.category !== 'Document Loaders') {
continue
}
if (node.data.inputs) {
const inputs = node.data.inputs
const keys = Object.getOwnPropertyNames(inputs)
for (let i = 0; i < keys.length; i++) {
const fileNames: string[] = []
const key = keys[i]
const input = inputs?.[key]
if (!input) {
continue
}
if (typeof input !== 'string') {
continue
}
if (input.startsWith('[')) {
try {
const files = JSON.parse(input)
for (let j = 0; j < files.length; j++) {
const file = files[j]
if (re.test(file)) {
await checkStorage(orgId, subscriptionId, usageCacheManager)
const { path, totalSize } = await addBase64FilesToStorage(file, chatflowid, fileNames, orgId)
node.data.inputs[key] = path
await updateStorageUsage(orgId, workspaceId, totalSize, usageCacheManager)
}
}
} catch (e) {
continue
}
} else if (re.test(input)) {
await checkStorage(orgId, subscriptionId, usageCacheManager)
const { path, totalSize } = await addBase64FilesToStorage(input, chatflowid, fileNames, orgId)
node.data.inputs[key] = path
await updateStorageUsage(orgId, workspaceId, totalSize, usageCacheManager)
}
}
}
}
return JSON.stringify(parsedFlowData)
} catch (e: any) {
throw new Error(`Error updating flow data with file paths: ${e.message}`)
}
}