diff --git a/dbal/production/build-config/CMakeLists.txt b/dbal/production/build-config/CMakeLists.txt index 23689a329..5f8f8589b 100644 --- a/dbal/production/build-config/CMakeLists.txt +++ b/dbal/production/build-config/CMakeLists.txt @@ -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) - diff --git a/dbal/production/src/adapters/sql/sql_adapter.hpp b/dbal/production/src/adapters/sql/sql_adapter.hpp index 7c892dcaa..928cb8ab3 100644 --- a/dbal/production/src/adapters/sql/sql_adapter.hpp +++ b/dbal/production/src/adapters/sql/sql_adapter.hpp @@ -11,9 +11,9 @@ #include #include -#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 createPage(const CreatePageInput& input) override { (void)input; - return Error::notImplemented("SQL adapter createPage"); + return Error(ErrorCode::CapabilityNotSupported, "SQL adapter createPage"); } Result getPage(const std::string& id) override { (void)id; - return Error::notImplemented("SQL adapter getPage"); + return Error(ErrorCode::CapabilityNotSupported, "SQL adapter getPage"); } Result 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 deletePage(const std::string& id) override { (void)id; - return Error::notImplemented("SQL adapter deletePage"); + return Error(ErrorCode::CapabilityNotSupported, "SQL adapter deletePage"); } Result> listPages(const ListOptions& options) override { (void)options; - return Error::notImplemented("SQL adapter listPages"); + return Error(ErrorCode::CapabilityNotSupported, "SQL adapter listPages"); } Result createWorkflow(const CreateWorkflowInput& input) override { (void)input; - return Error::notImplemented("SQL adapter createWorkflow"); + return Error(ErrorCode::CapabilityNotSupported, "SQL adapter createWorkflow"); } Result getWorkflow(const std::string& id) override { (void)id; - return Error::notImplemented("SQL adapter getWorkflow"); + return Error(ErrorCode::CapabilityNotSupported, "SQL adapter getWorkflow"); } Result 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 deleteWorkflow(const std::string& id) override { (void)id; - return Error::notImplemented("SQL adapter deleteWorkflow"); + return Error(ErrorCode::CapabilityNotSupported, "SQL adapter deleteWorkflow"); } Result> listWorkflows(const ListOptions& options) override { (void)options; - return Error::notImplemented("SQL adapter listWorkflows"); + return Error(ErrorCode::CapabilityNotSupported, "SQL adapter listWorkflows"); } Result createSession(const CreateSessionInput& input) override { (void)input; - return Error::notImplemented("SQL adapter createSession"); + return Error(ErrorCode::CapabilityNotSupported, "SQL adapter createSession"); } Result getSession(const std::string& id) override { (void)id; - return Error::notImplemented("SQL adapter getSession"); + return Error(ErrorCode::CapabilityNotSupported, "SQL adapter getSession"); } Result 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 deleteSession(const std::string& id) override { (void)id; - return Error::notImplemented("SQL adapter deleteSession"); + return Error(ErrorCode::CapabilityNotSupported, "SQL adapter deleteSession"); } Result> listSessions(const ListOptions& options) override { (void)options; - return Error::notImplemented("SQL adapter listSessions"); - } - - Result createLuaScript(const CreateLuaScriptInput& input) override { - (void)input; - return Error::notImplemented("SQL adapter createLuaScript"); - } - - Result getLuaScript(const std::string& id) override { - (void)id; - return Error::notImplemented("SQL adapter getLuaScript"); - } - - Result updateLuaScript(const std::string& id, const UpdateLuaScriptInput& input) override { - (void)id; - (void)input; - return Error::notImplemented("SQL adapter updateLuaScript"); - } - - Result deleteLuaScript(const std::string& id) override { - (void)id; - return Error::notImplemented("SQL adapter deleteLuaScript"); - } - - Result> listLuaScripts(const ListOptions& options) override { - (void)options; - return Error::notImplemented("SQL adapter listLuaScripts"); + return Error(ErrorCode::CapabilityNotSupported, "SQL adapter listSessions"); } Result createPackage(const CreatePackageInput& input) override { (void)input; - return Error::notImplemented("SQL adapter createPackage"); + return Error(ErrorCode::CapabilityNotSupported, "SQL adapter createPackage"); } Result getPackage(const std::string& id) override { (void)id; - return Error::notImplemented("SQL adapter getPackage"); + return Error(ErrorCode::CapabilityNotSupported, "SQL adapter getPackage"); } Result 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 deletePackage(const std::string& id) override { (void)id; - return Error::notImplemented("SQL adapter deletePackage"); + return Error(ErrorCode::CapabilityNotSupported, "SQL adapter deletePackage"); } Result> listPackages(const ListOptions& options) override { (void)options; - return Error::notImplemented("SQL adapter listPackages"); - } - - Result batchCreatePackages(const std::vector& inputs) override { - (void)inputs; - return Error::notImplemented("SQL adapter batchCreatePackages"); - } - - Result batchUpdatePackages(const std::vector& updates) override { - (void)updates; - return Error::notImplemented("SQL adapter batchUpdatePackages"); - } - - Result batchDeletePackages(const std::vector& 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& 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() : 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& 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& params, - const std::string& type) const { - drogon::Json::Value payload; + ::Json::Value buildPayload(const std::string& sql, + const std::vector& 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; } diff --git a/dbal/production/src/adapters/sqlite/sqlite_adapter.cpp b/dbal/production/src/adapters/sqlite/sqlite_adapter.cpp index b7b5d6015..0cb18089e 100644 --- a/dbal/production/src/adapters/sqlite/sqlite_adapter.cpp +++ b/dbal/production/src/adapters/sqlite/sqlite_adapter.cpp @@ -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(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); } @@ -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); } @@ -155,42 +154,6 @@ public: return Result>(sessions); } - Result 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(script); - } - - Result getLuaScript(const std::string& id) override { - return Error::notFound("Lua script not found: " + id); - } - - Result updateLuaScript(const std::string& id, const UpdateLuaScriptInput& input) override { - return Error::notFound("Lua script not found: " + id); - } - - Result deleteLuaScript(const std::string& id) override { - return Result(true); - } - - Result> listLuaScripts(const ListOptions& options) override { - std::vector scripts; - return Result>(scripts); - } - Result createPackage(const CreatePackageInput& input) override { InstalledPackage package; package.packageId = input.packageId; diff --git a/dbal/production/src/entities/page/crud/create_page.hpp b/dbal/production/src/entities/page/crud/create_page.hpp index ad5463989..577d1d522 100644 --- a/dbal/production/src/entities/page/crud/create_page.hpp +++ b/dbal/production/src/entities/page/crud/create_page.hpp @@ -51,7 +51,6 @@ inline Result 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; diff --git a/dbal/production/src/entities/page/crud/update_page.hpp b/dbal/production/src/entities/page/crud/update_page.hpp index a92799cb0..758d70d11 100644 --- a/dbal/production/src/entities/page/crud/update_page.hpp +++ b/dbal/production/src/entities/page/crud/update_page.hpp @@ -70,7 +70,6 @@ inline Result 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(page); } diff --git a/dbal/production/src/entities/session/crud/create_session.hpp b/dbal/production/src/entities/session/crud/create_session.hpp index 894ccdc40..29efcbc45 100644 --- a/dbal/production/src/entities/session/crud/create_session.hpp +++ b/dbal/production/src/entities/session/crud/create_session.hpp @@ -38,8 +38,8 @@ inline Result 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; diff --git a/dbal/production/src/entities/session/crud/update_session.hpp b/dbal/production/src/entities/session/crud/update_session.hpp index 04c5c1a48..9ce14d905 100644 --- a/dbal/production/src/entities/session/crud/update_session.hpp +++ b/dbal/production/src/entities/session/crud/update_session.hpp @@ -59,12 +59,12 @@ inline Result 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); diff --git a/dbal/production/src/entities/workflow/crud/create_workflow.hpp b/dbal/production/src/entities/workflow/crud/create_workflow.hpp index 638035104..52b182e0b 100644 --- a/dbal/production/src/entities/workflow/crud/create_workflow.hpp +++ b/dbal/production/src/entities/workflow/crud/create_workflow.hpp @@ -35,7 +35,7 @@ inline Result 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; diff --git a/dbal/production/src/entities/workflow/crud/update_workflow.hpp b/dbal/production/src/entities/workflow/crud/update_workflow.hpp index aaed0062b..cf3de0a2d 100644 --- a/dbal/production/src/entities/workflow/crud/update_workflow.hpp +++ b/dbal/production/src/entities/workflow/crud/update_workflow.hpp @@ -73,8 +73,6 @@ inline Result 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()) { diff --git a/dbal/production/src/runtime/requests_client.hpp b/dbal/production/src/runtime/requests_client.hpp index ac49bebb8..ad1244170 100644 --- a/dbal/production/src/runtime/requests_client.hpp +++ b/dbal/production/src/runtime/requests_client.hpp @@ -1,22 +1,23 @@ #ifndef DBAL_REQUESTS_CLIENT_HPP #define DBAL_REQUESTS_CLIENT_HPP -#include -#include - -#include -#include -#include +#include +#include + +#include +#include +#include +#include namespace dbal { namespace runtime { -struct RequestsResponse { - int statusCode; - std::string body; - drogon::Json::Value json; - std::unordered_map headers; -}; +struct RequestsResponse { + int statusCode; + std::string body; + ::Json::Value json; + std::unordered_map 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; } diff --git a/dbal/shared/docs/IMPLEMENTATION_SUMMARY.md b/dbal/shared/docs/IMPLEMENTATION_SUMMARY.md index bbdec3b5d..5b0f3dac2 100644 --- a/dbal/shared/docs/IMPLEMENTATION_SUMMARY.md +++ b/dbal/shared/docs/IMPLEMENTATION_SUMMARY.md @@ -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 diff --git a/dbal/shared/docs/PHASE2_COMPLETE.md b/dbal/shared/docs/PHASE2_COMPLETE.md index 36174df82..9fdadb795 100644 --- a/dbal/shared/docs/PHASE2_COMPLETE.md +++ b/dbal/shared/docs/PHASE2_COMPLETE.md @@ -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* diff --git a/dbal/shared/docs/PHASE2_IMPLEMENTATION.md b/dbal/shared/docs/PHASE2_IMPLEMENTATION.md index 820779bb1..400f27ced 100644 --- a/dbal/shared/docs/PHASE2_IMPLEMENTATION.md +++ b/dbal/shared/docs/PHASE2_IMPLEMENTATION.md @@ -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 diff --git a/dbal/shared/tools/codegen/gen_prisma_schema.js b/dbal/shared/tools/codegen/gen_prisma_schema.js index ac2651006..660a812c8 100644 --- a/dbal/shared/tools/codegen/gen_prisma_schema.js +++ b/dbal/shared/tools/codegen/gen_prisma_schema.js @@ -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: [ diff --git a/frontends/nextjs/src/lib/db/core/entities.ts b/frontends/nextjs/src/lib/db/core/entities.ts index aec3f980e..31a63c635 100644 --- a/frontends/nextjs/src/lib/db/core/entities.ts +++ b/frontends/nextjs/src/lib/db/core/entities.ts @@ -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' diff --git a/frontends/nextjs/src/lib/db/core/operations.ts b/frontends/nextjs/src/lib/db/core/operations.ts index a8ad4cbbe..729cc154c 100644 --- a/frontends/nextjs/src/lib/db/core/operations.ts +++ b/frontends/nextjs/src/lib/db/core/operations.ts @@ -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 diff --git a/frontends/nextjs/src/lib/db/core/types.ts b/frontends/nextjs/src/lib/db/core/types.ts index d2541a3c1..22f0d0425 100644 --- a/frontends/nextjs/src/lib/db/core/types.ts +++ b/frontends/nextjs/src/lib/db/core/types.ts @@ -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 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', diff --git a/frontends/nextjs/src/lib/db/database-admin/clear-database.ts b/frontends/nextjs/src/lib/db/database-admin/clear-database.ts index 8ac154fa2..e0693ead3 100644 --- a/frontends/nextjs/src/lib/db/database-admin/clear-database.ts +++ b/frontends/nextjs/src/lib/db/database-admin/clear-database.ts @@ -4,7 +4,6 @@ const ENTITY_TYPES = [ 'User', 'Credential', 'Workflow', - 'LuaScript', 'PageConfig', 'ModelSchema', 'AppConfiguration', diff --git a/frontends/nextjs/src/lib/db/database-admin/export/export-database.ts b/frontends/nextjs/src/lib/db/database-admin/export/export-database.ts index 850d1c0ae..1f0f0545f 100644 --- a/frontends/nextjs/src/lib/db/database-admin/export/export-database.ts +++ b/frontends/nextjs/src/lib/db/database-admin/export/export-database.ts @@ -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 { const data: Partial = { users: await getUsers({ scope: 'all' }), workflows: await getWorkflows(), - luaScripts: await getLuaScripts(), pages: await getPages(), schemas: await getSchemas(), appConfig: (await getAppConfig()) ?? undefined, diff --git a/frontends/nextjs/src/lib/db/lua-scripts/crud/add-lua-script.ts b/frontends/nextjs/src/lib/db/lua-scripts/crud/add-lua-script.ts deleted file mode 100644 index 938f62ba6..000000000 --- a/frontends/nextjs/src/lib/db/lua-scripts/crud/add-lua-script.ts +++ /dev/null @@ -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 { - 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, - }) -} diff --git a/frontends/nextjs/src/lib/db/lua-scripts/crud/delete-lua-script.ts b/frontends/nextjs/src/lib/db/lua-scripts/crud/delete-lua-script.ts deleted file mode 100644 index 28c23fa71..000000000 --- a/frontends/nextjs/src/lib/db/lua-scripts/crud/delete-lua-script.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { getAdapter } from '../../core/dbal-client' - -/** - * Delete a Lua script by ID - */ -export async function deleteLuaScript(scriptId: string): Promise { - const adapter = getAdapter() - await adapter.delete('LuaScript', scriptId) -} diff --git a/frontends/nextjs/src/lib/db/lua-scripts/crud/get-lua-scripts.ts b/frontends/nextjs/src/lib/db/lua-scripts/crud/get-lua-scripts.ts deleted file mode 100644 index 2fc7a97ce..000000000 --- a/frontends/nextjs/src/lib/db/lua-scripts/crud/get-lua-scripts.ts +++ /dev/null @@ -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 { - 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, - })) -} diff --git a/frontends/nextjs/src/lib/db/lua-scripts/crud/set-lua-scripts.ts b/frontends/nextjs/src/lib/db/lua-scripts/crud/set-lua-scripts.ts deleted file mode 100644 index 29a1c93d6..000000000 --- a/frontends/nextjs/src/lib/db/lua-scripts/crud/set-lua-scripts.ts +++ /dev/null @@ -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 { - 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, - }) - } -} diff --git a/frontends/nextjs/src/lib/db/lua-scripts/crud/update-lua-script.ts b/frontends/nextjs/src/lib/db/lua-scripts/crud/update-lua-script.ts deleted file mode 100644 index 05dea918b..000000000 --- a/frontends/nextjs/src/lib/db/lua-scripts/crud/update-lua-script.ts +++ /dev/null @@ -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 -): Promise { - const adapter = getAdapter() - const data: Record = {} - 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) -} diff --git a/frontends/nextjs/src/lib/db/lua-scripts/index.ts b/frontends/nextjs/src/lib/db/lua-scripts/index.ts deleted file mode 100644 index d90b5466b..000000000 --- a/frontends/nextjs/src/lib/db/lua-scripts/index.ts +++ /dev/null @@ -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' diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 7b3e72398..a111b9d79 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -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?