refactor: remove LuaScript entity and related operations

This commit is contained in:
2026-01-07 14:36:19 +00:00
parent 7eee87ec90
commit 016cd662bf
26 changed files with 88 additions and 336 deletions

View File

@@ -34,7 +34,7 @@ add_library(dbal_adapters STATIC
${DBAL_SRC_DIR}/adapters/sql/mysql_adapter.cpp
)
target_link_libraries(dbal_adapters PRIVATE cpr::cpr)
target_link_libraries(dbal_adapters PRIVATE cpr::cpr Drogon::Drogon)
add_executable(dbal_daemon
${DBAL_SRC_DIR}/daemon/main.cpp
${DBAL_SRC_DIR}/daemon/server.cpp
@@ -101,4 +101,3 @@ add_test(NAME conformance_tests COMMAND conformance_tests)
install(TARGETS dbal_daemon DESTINATION bin)
install(DIRECTORY ${DBAL_INCLUDE_DIR}/dbal DESTINATION include)

View File

@@ -11,9 +11,9 @@
#include <unordered_map>
#include <vector>
#include "../../adapters/adapter.hpp"
#include "../../types.hpp"
#include "../../errors.hpp"
#include "dbal/adapters/adapter.hpp"
#include "dbal/types.hpp"
#include "dbal/errors.hpp"
#include "sql_connection.hpp"
#include "../../runtime/requests_client.hpp"
@@ -243,147 +243,106 @@ public:
Result<PageConfig> createPage(const CreatePageInput& input) override {
(void)input;
return Error::notImplemented("SQL adapter createPage");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter createPage");
}
Result<PageConfig> getPage(const std::string& id) override {
(void)id;
return Error::notImplemented("SQL adapter getPage");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter getPage");
}
Result<PageConfig> updatePage(const std::string& id, const UpdatePageInput& input) override {
(void)id;
(void)input;
return Error::notImplemented("SQL adapter updatePage");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter updatePage");
}
Result<bool> deletePage(const std::string& id) override {
(void)id;
return Error::notImplemented("SQL adapter deletePage");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter deletePage");
}
Result<std::vector<PageConfig>> listPages(const ListOptions& options) override {
(void)options;
return Error::notImplemented("SQL adapter listPages");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter listPages");
}
Result<Workflow> createWorkflow(const CreateWorkflowInput& input) override {
(void)input;
return Error::notImplemented("SQL adapter createWorkflow");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter createWorkflow");
}
Result<Workflow> getWorkflow(const std::string& id) override {
(void)id;
return Error::notImplemented("SQL adapter getWorkflow");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter getWorkflow");
}
Result<Workflow> updateWorkflow(const std::string& id, const UpdateWorkflowInput& input) override {
(void)id;
(void)input;
return Error::notImplemented("SQL adapter updateWorkflow");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter updateWorkflow");
}
Result<bool> deleteWorkflow(const std::string& id) override {
(void)id;
return Error::notImplemented("SQL adapter deleteWorkflow");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter deleteWorkflow");
}
Result<std::vector<Workflow>> listWorkflows(const ListOptions& options) override {
(void)options;
return Error::notImplemented("SQL adapter listWorkflows");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter listWorkflows");
}
Result<Session> createSession(const CreateSessionInput& input) override {
(void)input;
return Error::notImplemented("SQL adapter createSession");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter createSession");
}
Result<Session> getSession(const std::string& id) override {
(void)id;
return Error::notImplemented("SQL adapter getSession");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter getSession");
}
Result<Session> updateSession(const std::string& id, const UpdateSessionInput& input) override {
(void)id;
(void)input;
return Error::notImplemented("SQL adapter updateSession");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter updateSession");
}
Result<bool> deleteSession(const std::string& id) override {
(void)id;
return Error::notImplemented("SQL adapter deleteSession");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter deleteSession");
}
Result<std::vector<Session>> listSessions(const ListOptions& options) override {
(void)options;
return Error::notImplemented("SQL adapter listSessions");
}
Result<LuaScript> createLuaScript(const CreateLuaScriptInput& input) override {
(void)input;
return Error::notImplemented("SQL adapter createLuaScript");
}
Result<LuaScript> getLuaScript(const std::string& id) override {
(void)id;
return Error::notImplemented("SQL adapter getLuaScript");
}
Result<LuaScript> updateLuaScript(const std::string& id, const UpdateLuaScriptInput& input) override {
(void)id;
(void)input;
return Error::notImplemented("SQL adapter updateLuaScript");
}
Result<bool> deleteLuaScript(const std::string& id) override {
(void)id;
return Error::notImplemented("SQL adapter deleteLuaScript");
}
Result<std::vector<LuaScript>> listLuaScripts(const ListOptions& options) override {
(void)options;
return Error::notImplemented("SQL adapter listLuaScripts");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter listSessions");
}
Result<InstalledPackage> createPackage(const CreatePackageInput& input) override {
(void)input;
return Error::notImplemented("SQL adapter createPackage");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter createPackage");
}
Result<InstalledPackage> getPackage(const std::string& id) override {
(void)id;
return Error::notImplemented("SQL adapter getPackage");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter getPackage");
}
Result<InstalledPackage> updatePackage(const std::string& id, const UpdatePackageInput& input) override {
(void)id;
(void)input;
return Error::notImplemented("SQL adapter updatePackage");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter updatePackage");
}
Result<bool> deletePackage(const std::string& id) override {
(void)id;
return Error::notImplemented("SQL adapter deletePackage");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter deletePackage");
}
Result<std::vector<InstalledPackage>> listPackages(const ListOptions& options) override {
(void)options;
return Error::notImplemented("SQL adapter listPackages");
}
Result<int> batchCreatePackages(const std::vector<CreatePackageInput>& inputs) override {
(void)inputs;
return Error::notImplemented("SQL adapter batchCreatePackages");
}
Result<int> batchUpdatePackages(const std::vector<UpdatePackageBatchItem>& updates) override {
(void)updates;
return Error::notImplemented("SQL adapter batchUpdatePackages");
}
Result<int> batchDeletePackages(const std::vector<std::string>& ids) override {
(void)ids;
return Error::notImplemented("SQL adapter batchDeletePackages");
return Error(ErrorCode::CapabilityNotSupported, "SQL adapter listPackages");
}
void close() override {
@@ -523,14 +482,12 @@ protected:
class PostgresAdapter : public SqlAdapter {
public:
explicit PostgresAdapter(const SqlConnectionConfig& config)
: SqlAdapter(config, Dialect::Postgres) {}
explicit PostgresAdapter(const SqlConnectionConfig& config);
};
class MySQLAdapter : public SqlAdapter {
public:
explicit MySQLAdapter(const SqlConnectionConfig& config)
: SqlAdapter(config, Dialect::MySQL) {}
explicit MySQLAdapter(const SqlConnectionConfig& config);
};
class PrismaAdapter : public SqlAdapter {
@@ -550,7 +507,11 @@ public:
const std::vector<SqlParam>& params) override {
(void)connection;
const auto payload = buildPayload(sql, params, "query");
const auto response = requestsClient_.post("/api/native-prisma", payload.dump());
::Json::StreamWriterBuilder writer;
writer["indentation"] = "";
const auto response = requestsClient_.post(
"/api/native-prisma",
::Json::writeString(writer, payload));
if (response.statusCode != 200) {
throw SqlError{SqlError::Code::Unknown, "Native Prisma bridge request failed"};
}
@@ -559,8 +520,18 @@ public:
if (!rowsJson.isNull() && rowsJson.isArray()) {
for (const auto& entry : rowsJson) {
SqlRow row;
for (const auto& [key, value] : entry.items()) {
row.columns[key] = value.isString() ? value.get<std::string>() : value.dump();
if (entry.isObject()) {
const auto keys = entry.getMemberNames();
for (const auto& key : keys) {
const auto& value = entry[key];
if (value.isString()) {
row.columns[key] = value.asString();
} else {
::Json::StreamWriterBuilder writer;
writer["indentation"] = "";
row.columns[key] = ::Json::writeString(writer, value);
}
}
}
rows.push_back(std::move(row));
}
@@ -573,7 +544,11 @@ public:
const std::vector<SqlParam>& params) override {
(void)connection;
const auto payload = buildPayload(sql, params, "nonquery");
const auto response = requestsClient_.post("/api/native-prisma", payload.dump());
::Json::StreamWriterBuilder writer;
writer["indentation"] = "";
const auto response = requestsClient_.post(
"/api/native-prisma",
::Json::writeString(writer, payload));
if (response.statusCode != 200) {
throw SqlError{SqlError::Code::Unknown, "Native Prisma bridge request failed"};
}
@@ -614,15 +589,15 @@ private:
}
runtime::RequestsClient requestsClient_;
drogon::Json::Value buildPayload(const std::string& sql,
const std::vector<SqlParam>& params,
const std::string& type) const {
drogon::Json::Value payload;
::Json::Value buildPayload(const std::string& sql,
const std::vector<SqlParam>& params,
const std::string& type) const {
::Json::Value payload;
payload["sql"] = sql;
payload["type"] = type;
payload["params"] = drogon::Json::Value::array();
payload["params"] = ::Json::Value(::Json::arrayValue);
for (const auto& param : params) {
payload["params"].push_back(param.value);
payload["params"].append(param.value);
}
return payload;
}

View File

@@ -69,7 +69,6 @@ public:
page.params = input.params;
page.meta = input.meta;
page.createdAt = std::chrono::system_clock::now();
page.updatedAt = page.createdAt;
return Result<PageConfig>(page);
}
@@ -103,7 +102,7 @@ public:
workflow.version = input.version;
workflow.createdBy = input.createdBy;
workflow.createdAt = input.createdAt.value_or(std::chrono::system_clock::now());
workflow.updatedAt = input.updatedAt.value_or(workflow.createdAt);
workflow.updatedAt = input.updatedAt;
return Result<Workflow>(workflow);
}
@@ -133,8 +132,8 @@ public:
session.expiresAt = input.expiresAt;
session.createdAt = input.createdAt.value_or(std::chrono::system_clock::now());
session.lastActivity = input.lastActivity.value_or(session.createdAt);
session.ip_address = input.ip_address;
session.user_agent = input.user_agent;
session.ipAddress = input.ipAddress;
session.userAgent = input.userAgent;
return Result<Session>(session);
}
@@ -155,42 +154,6 @@ public:
return Result<std::vector<Session>>(sessions);
}
Result<LuaScript> createLuaScript(const CreateLuaScriptInput& input) override {
LuaScript script;
script.id = "lua_" + input.name;
script.tenantId = input.tenantId;
script.name = input.name;
script.description = input.description;
script.code = input.code;
script.parameters = input.parameters;
script.returnType = input.returnType;
script.isSandboxed = input.isSandboxed;
script.allowedGlobals = input.allowedGlobals;
script.timeoutMs = input.timeoutMs;
script.version = input.version;
script.createdBy = input.createdBy;
script.createdAt = input.createdAt.value_or(std::chrono::system_clock::now());
script.updatedAt = input.updatedAt.value_or(script.createdAt);
return Result<LuaScript>(script);
}
Result<LuaScript> getLuaScript(const std::string& id) override {
return Error::notFound("Lua script not found: " + id);
}
Result<LuaScript> updateLuaScript(const std::string& id, const UpdateLuaScriptInput& input) override {
return Error::notFound("Lua script not found: " + id);
}
Result<bool> deleteLuaScript(const std::string& id) override {
return Result<bool>(true);
}
Result<std::vector<LuaScript>> listLuaScripts(const ListOptions& options) override {
std::vector<LuaScript> scripts;
return Result<std::vector<LuaScript>>(scripts);
}
Result<InstalledPackage> createPackage(const CreatePackageInput& input) override {
InstalledPackage package;
package.packageId = input.packageId;

View File

@@ -51,7 +51,6 @@ inline Result<PageConfig> create(InMemoryStore& store, const CreatePageInput& in
page.params = input.params;
page.meta = input.meta;
page.createdAt = std::chrono::system_clock::now();
page.updatedAt = page.createdAt;
store.pages[page.id] = page;
store.page_paths[page.path] = page.id;

View File

@@ -70,7 +70,6 @@ inline Result<PageConfig> update(InMemoryStore& store, const std::string& id, co
if (input.packageId.has_value()) page.packageId = input.packageId.value();
if (input.tenantId.has_value()) page.tenantId = input.tenantId.value();
page.updatedAt = std::chrono::system_clock::now();
return Result<PageConfig>(page);
}

View File

@@ -38,8 +38,8 @@ inline Result<Session> create(InMemoryStore& store, const CreateSessionInput& in
session.expiresAt = input.expiresAt;
session.createdAt = input.createdAt.value_or(std::chrono::system_clock::now());
session.lastActivity = input.lastActivity.value_or(session.createdAt);
session.ip_address = input.ip_address;
session.user_agent = input.user_agent;
session.ipAddress = input.ipAddress;
session.userAgent = input.userAgent;
store.sessions[session.id] = session;
store.session_tokens[session.token] = session.id;

View File

@@ -59,12 +59,12 @@ inline Result<Session> update(InMemoryStore& store, const std::string& id, const
session.lastActivity = input.lastActivity.value();
}
if (input.ip_address.has_value()) {
session.ip_address = input.ip_address.value();
if (input.ipAddress.has_value()) {
session.ipAddress = input.ipAddress.value();
}
if (input.user_agent.has_value()) {
session.user_agent = input.user_agent.value();
if (input.userAgent.has_value()) {
session.userAgent = input.userAgent.value();
}
return Result<Session>(session);

View File

@@ -35,7 +35,7 @@ inline Result<Workflow> create(InMemoryStore& store, const CreateWorkflowInput&
workflow.enabled = input.enabled;
workflow.version = input.version;
workflow.createdAt = input.createdAt.value_or(std::chrono::system_clock::now());
workflow.updatedAt = input.updatedAt.value_or(workflow.createdAt);
workflow.updatedAt = input.updatedAt;
workflow.createdBy = input.createdBy;
store.workflows[workflow.id] = workflow;

View File

@@ -73,8 +73,6 @@ inline Result<Workflow> update(InMemoryStore& store, const std::string& id, cons
if (input.updatedAt.has_value()) {
workflow.updatedAt = input.updatedAt.value();
} else {
workflow.updatedAt = std::chrono::system_clock::now();
}
if (input.tenantId.has_value()) {

View File

@@ -1,22 +1,23 @@
#ifndef DBAL_REQUESTS_CLIENT_HPP
#define DBAL_REQUESTS_CLIENT_HPP
#include <cpr/cpr.h>
#include <drogon/Json.h>
#include <stdexcept>
#include <string>
#include <unordered_map>
#include <cpr/cpr.h>
#include <json/json.h>
#include <memory>
#include <stdexcept>
#include <string>
#include <unordered_map>
namespace dbal {
namespace runtime {
struct RequestsResponse {
int statusCode;
std::string body;
drogon::Json::Value json;
std::unordered_map<std::string, std::string> headers;
};
struct RequestsResponse {
int statusCode;
std::string body;
::Json::Value json;
std::unordered_map<std::string, std::string> headers;
};
class RequestsClient {
public:
@@ -70,12 +71,15 @@ public:
result.headers[key] = value;
}
if (!response.text.empty()) {
try {
result.json = drogon::Json::parse(response.text);
} catch (...) {
}
}
if (!response.text.empty()) {
::Json::CharReaderBuilder builder;
std::string errs;
std::unique_ptr<::Json::CharReader> reader(builder.newCharReader());
reader->parse(response.text.data(),
response.text.data() + response.text.size(),
&result.json,
&errs);
}
return result;
}

View File

@@ -250,9 +250,8 @@ dbal/shared/common/contracts/
- Access level enforcement
- Cascade delete support
### Workflow & LuaScript
- Workflow automation
- Sandboxed Lua execution
### Workflow Automation
- Workflow orchestration
- Security scanning
- Timeout enforcement

View File

@@ -249,7 +249,6 @@ try {
| PageConfig | R | R | CRUD | CRUD |
| ComponentNode | — | — | CRUD | CRUD |
| Workflow | — | — | CRUD | CRUD |
| LuaScript | — | — | CRUD | CRUD |
| InstalledPackage | — | R | CRUD | CRUD |
*R=Read, U=Update, C=Create, D=Delete*

View File

@@ -201,7 +201,6 @@ The ACL adapter enforces these rules by default:
| PageConfig | Read | Read/List | All ops | All ops |
| ComponentNode | — | — | All ops | All ops |
| Workflow | — | — | All ops | All ops |
| LuaScript | — | — | All ops | All ops |
| InstalledPackage | — | Read/List | All ops | All ops |
### Row-Level Security

View File

@@ -123,26 +123,6 @@ const models = [
],
blockAttributes: ['@@index([tenantId])', '@@index([enabled])'],
},
{
name: 'LuaScript',
fields: [
{ name: 'id', type: 'String', attributes: ['@id'] },
{ name: 'tenantId', type: 'String?' },
{ name: 'name', type: 'String' },
{ name: 'description', type: 'String?' },
{ name: 'code', type: 'String' },
{ name: 'parameters', type: 'String', comment: '// JSON: Array<{name, type}>' },
{ name: 'returnType', type: 'String?' },
{ name: 'isSandboxed', type: 'Boolean', attributes: ['@default(true)'] },
{ name: 'allowedGlobals', type: 'String', attributes: ['@default("[]")'] },
{ name: 'timeoutMs', type: 'Int', attributes: ['@default(5000)'] },
{ name: 'version', type: 'Int', attributes: ['@default(1)'] },
{ name: 'createdAt', type: 'BigInt?' },
{ name: 'updatedAt', type: 'BigInt?' },
{ name: 'createdBy', type: 'String?' },
],
blockAttributes: ['@@index([tenantId])', '@@index([name])'],
},
{
name: 'InstalledPackage',
fields: [

View File

@@ -8,7 +8,6 @@ export * from '../database-admin'
export * from '../dropdown-configs'
export * from '../error-logs'
export * from '../god-credentials'
export * from '../lua-scripts'
export * from '../packages'
export * from '../pages'
export * from '../power-transfers'

View File

@@ -7,7 +7,6 @@ import * as databaseAdmin from '../database-admin'
import * as dropdownConfigs from '../dropdown-configs'
import * as errorLogs from '../error-logs'
import * as godCredentials from '../god-credentials'
import * as luaScripts from '../lua-scripts'
import * as packages from '../packages'
import * as pages from '../pages'
import { hashPassword } from '../password/hash-password'
@@ -66,13 +65,6 @@ export class Database {
static updateWorkflow = workflows.updateWorkflow
static deleteWorkflow = workflows.deleteWorkflow
// Lua Scripts
static getLuaScripts = luaScripts.getLuaScripts
static setLuaScripts = luaScripts.setLuaScripts
static addLuaScript = luaScripts.addLuaScript
static updateLuaScript = luaScripts.updateLuaScript
static deleteLuaScript = luaScripts.deleteLuaScript
// Pages
static getPages = pages.getPages
static setPages = pages.setPages

View File

@@ -47,7 +47,6 @@ export interface ComponentConfig {
import type {
AppConfiguration,
Comment,
LuaScript,
PageConfig,
PowerTransferRequest,
Tenant,
@@ -64,7 +63,6 @@ export interface DatabaseSchema {
users: User[]
credentials: Record<string, string>
workflows: Workflow[]
luaScripts: LuaScript[]
pages: PageConfig[]
schemas: ModelSchema[]
appConfig: AppConfiguration
@@ -90,7 +88,6 @@ export const DB_KEYS = {
USERS: 'db_users',
CREDENTIALS: 'db_credentials',
WORKFLOWS: 'db_workflows',
LUA_SCRIPTS: 'db_lua_scripts',
PAGES: 'db_pages',
SCHEMAS: 'db_schemas',
APP_CONFIG: 'db_app_config',

View File

@@ -4,7 +4,6 @@ const ENTITY_TYPES = [
'User',
'Credential',
'Workflow',
'LuaScript',
'PageConfig',
'ModelSchema',
'AppConfiguration',

View File

@@ -1,7 +1,6 @@
import { getAppConfig } from '../../app-config'
import { getComments } from '../../comments'
import { getComponentConfigs, getComponentHierarchy } from '../../components'
import { getLuaScripts } from '../../lua-scripts'
import { getPages } from '../../pages'
import { getSchemas } from '../../schemas'
import type { DatabaseSchema } from '../../types'
@@ -15,7 +14,6 @@ export async function exportDatabase(): Promise<string> {
const data: Partial<DatabaseSchema> = {
users: await getUsers({ scope: 'all' }),
workflows: await getWorkflows(),
luaScripts: await getLuaScripts(),
pages: await getPages(),
schemas: await getSchemas(),
appConfig: (await getAppConfig()) ?? undefined,

View File

@@ -1,21 +0,0 @@
import { getAdapter } from '../../core/dbal-client'
import type { LuaScript } from '@/lib/types/level-types'
/**
* Add a Lua script
*/
export async function addLuaScript(script: LuaScript): Promise<void> {
const adapter = getAdapter()
await adapter.create('LuaScript', {
id: script.id,
tenantId: script.tenantId,
name: script.name,
description: script.description,
code: script.code,
parameters: script.parameters,
returnType: script.returnType,
isSandboxed: script.isSandboxed ?? true,
allowedGlobals: script.allowedGlobals ?? '[]',
timeoutMs: script.timeoutMs ?? 5000,
})
}

View File

@@ -1,9 +0,0 @@
import { getAdapter } from '../../core/dbal-client'
/**
* Delete a Lua script by ID
*/
export async function deleteLuaScript(scriptId: string): Promise<void> {
const adapter = getAdapter()
await adapter.delete('LuaScript', scriptId)
}

View File

@@ -1,35 +0,0 @@
import { getAdapter } from '../../core/dbal-client'
import type { LuaScript } from '@/lib/types/level-types'
type DBALLuaScriptRecord = {
id: string
tenantId?: string | null
name: string
description?: string | null
code: string
parameters: string
returnType?: string | null
isSandboxed: boolean
allowedGlobals: string
timeoutMs: number
}
/**
* Get all Lua scripts
*/
export async function getLuaScripts(): Promise<LuaScript[]> {
const adapter = getAdapter()
const result = (await adapter.list('LuaScript')) as { data: DBALLuaScriptRecord[] }
return result.data.map(script => ({
id: script.id,
tenantId: script.tenantId,
name: script.name,
description: script.description,
code: script.code,
parameters: script.parameters,
returnType: script.returnType,
isSandboxed: script.isSandboxed,
allowedGlobals: script.allowedGlobals,
timeoutMs: script.timeoutMs,
}))
}

View File

@@ -1,35 +0,0 @@
import { getAdapter } from '../../core/dbal-client'
import type { LuaScript } from '@/lib/types/level-types'
type DBALLuaScriptRecord = {
id: string
}
/**
* Set all Lua scripts (replaces existing)
*/
export async function setLuaScripts(scripts: LuaScript[]): Promise<void> {
const adapter = getAdapter()
// Delete existing scripts
const existing = (await adapter.list('LuaScript')) as { data: DBALLuaScriptRecord[] }
for (const script of existing.data) {
await adapter.delete('LuaScript', script.id)
}
// Create new scripts
for (const script of scripts) {
await adapter.create('LuaScript', {
id: script.id,
tenantId: script.tenantId,
name: script.name,
description: script.description,
code: script.code,
parameters: script.parameters,
returnType: script.returnType,
isSandboxed: script.isSandboxed ?? true,
allowedGlobals: script.allowedGlobals ?? '[]',
timeoutMs: script.timeoutMs ?? 5000,
})
}
}

View File

@@ -1,23 +0,0 @@
import { getAdapter } from '../../core/dbal-client'
import type { LuaScript } from '@/lib/types/level-types'
/**
* Update a Lua script by ID
*/
export async function updateLuaScript(
scriptId: string,
updates: Partial<LuaScript>
): Promise<void> {
const adapter = getAdapter()
const data: Record<string, unknown> = {}
if (updates.name !== undefined) data.name = updates.name
if (updates.description !== undefined) data.description = updates.description
if (updates.code !== undefined) data.code = updates.code
if (updates.parameters !== undefined) data.parameters = updates.parameters
if (updates.returnType !== undefined) data.returnType = updates.returnType
if (updates.isSandboxed !== undefined) data.isSandboxed = updates.isSandboxed
if (updates.allowedGlobals !== undefined) data.allowedGlobals = updates.allowedGlobals
if (updates.timeoutMs !== undefined) data.timeoutMs = updates.timeoutMs
await adapter.update('LuaScript', scriptId, data)
}

View File

@@ -1,5 +0,0 @@
export { getLuaScripts } from './crud/get-lua-scripts'
export { setLuaScripts } from './crud/set-lua-scripts'
export { addLuaScript } from './crud/add-lua-script'
export { updateLuaScript } from './crud/update-lua-script'
export { deleteLuaScript } from './crud/delete-lua-script'

View File

@@ -106,25 +106,6 @@ model Workflow {
@@index([enabled])
}
model LuaScript {
id String @id
tenantId String?
name String
description String?
code String
parameters String // JSON: Array<{name, type}>
returnType String?
isSandboxed Boolean @default(true)
allowedGlobals String @default("[]")
timeoutMs Int @default(5000)
version Int @default(1)
createdAt BigInt?
updatedAt BigInt?
createdBy String?
@@index([tenantId])
@@index([name])
}
model InstalledPackage {
packageId String @id
tenantId String?