mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-24 13:54:57 +00:00
refactor: remove LuaScript entity and related operations
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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*
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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: [
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -4,7 +4,6 @@ const ENTITY_TYPES = [
|
||||
'User',
|
||||
'Credential',
|
||||
'Workflow',
|
||||
'LuaScript',
|
||||
'PageConfig',
|
||||
'ModelSchema',
|
||||
'AppConfiguration',
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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,
|
||||
}))
|
||||
}
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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'
|
||||
@@ -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?
|
||||
|
||||
Reference in New Issue
Block a user