@sfmc-bds/db-server 0.1.0 → 0.2.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/db-tables.js +16 -17
- package/dist/db-tables.js.map +7 -1
- package/dist/domain/bridge.js +54 -77
- package/dist/domain/bridge.js.map +7 -1
- package/dist/domain/economy.d.ts +83 -2
- package/dist/domain/economy.d.ts.map +1 -1
- package/dist/domain/economy.js +292 -281
- package/dist/domain/economy.js.map +7 -1
- package/dist/domain/schema.js +480 -426
- package/dist/domain/schema.js.map +7 -1
- package/dist/domain/transaction.js +32 -80
- package/dist/domain/transaction.js.map +7 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +85 -84
- package/dist/env.js.map +7 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +218 -240
- package/dist/index.js.map +7 -1
- package/dist/lib/http.js +30 -39
- package/dist/lib/http.js.map +7 -1
- package/dist/lib/idempotency-store.js +34 -47
- package/dist/lib/idempotency-store.js.map +7 -1
- package/dist/lib/idempotency.js +8 -13
- package/dist/lib/idempotency.js.map +7 -1
- package/dist/lib/identifiers.js +18 -14
- package/dist/lib/identifiers.js.map +7 -1
- package/dist/lib/log.d.ts +3 -6
- package/dist/lib/log.d.ts.map +1 -1
- package/dist/lib/log.js +13 -14
- package/dist/lib/log.js.map +7 -1
- package/dist/lib/module-state.d.ts.map +1 -1
- package/dist/lib/module-state.js +32 -21
- package/dist/lib/module-state.js.map +7 -1
- package/dist/lib/order-by.d.ts +17 -0
- package/dist/lib/order-by.d.ts.map +1 -0
- package/dist/lib/order-by.js +24 -0
- package/dist/lib/order-by.js.map +7 -0
- package/dist/lib/runtime.js +16 -31
- package/dist/lib/runtime.js.map +7 -1
- package/dist/lib/sql-helpers.js +9 -27
- package/dist/lib/sql-helpers.js.map +7 -1
- package/dist/lib/sqlite.js +40 -52
- package/dist/lib/sqlite.js.map +7 -1
- package/dist/manifest-loader.d.ts.map +1 -1
- package/dist/manifest-loader.js +154 -195
- package/dist/manifest-loader.js.map +7 -1
- package/dist/manifest.d.ts +3 -7
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +76 -115
- package/dist/manifest.js.map +7 -1
- package/dist/module-auth.d.ts +17 -6
- package/dist/module-auth.d.ts.map +1 -1
- package/dist/module-auth.js +93 -107
- package/dist/module-auth.js.map +7 -1
- package/dist/module-runtime-sync.d.ts +37 -0
- package/dist/module-runtime-sync.d.ts.map +1 -0
- package/dist/module-runtime-sync.js +54 -0
- package/dist/module-runtime-sync.js.map +7 -0
- package/dist/permission-gate.d.ts.map +1 -1
- package/dist/permission-gate.js +55 -86
- package/dist/permission-gate.js.map +7 -1
- package/dist/routes/_shared.d.ts +7 -2
- package/dist/routes/_shared.d.ts.map +1 -1
- package/dist/routes/_shared.js +16 -25
- package/dist/routes/_shared.js.map +7 -1
- package/dist/routes/config.d.ts +11 -1
- package/dist/routes/config.d.ts.map +1 -1
- package/dist/routes/config.js +167 -213
- package/dist/routes/config.js.map +7 -1
- package/dist/routes/db-routes.d.ts +6 -10
- package/dist/routes/db-routes.d.ts.map +1 -1
- package/dist/routes/db-routes.js +198 -172
- package/dist/routes/db-routes.js.map +7 -1
- package/dist/routes/health.js +15 -20
- package/dist/routes/health.js.map +7 -1
- package/dist/routes/messages.d.ts.map +1 -1
- package/dist/routes/messages.js +56 -63
- package/dist/routes/messages.js.map +7 -1
- package/dist/routes/module-config-routes.d.ts.map +1 -1
- package/dist/routes/module-config-routes.js +92 -111
- package/dist/routes/module-config-routes.js.map +7 -1
- package/dist/routes/modules.d.ts.map +1 -1
- package/dist/routes/modules.js +82 -88
- package/dist/routes/modules.js.map +7 -1
- package/dist/routes/service-routes.d.ts.map +1 -1
- package/dist/routes/service-routes.js +54 -61
- package/dist/routes/service-routes.js.map +7 -1
- package/dist/runtime.test.js +248 -49
- package/dist/runtime.test.js.map +7 -1
- package/dist/schema-registry.d.ts.map +1 -1
- package/dist/schema-registry.js +119 -160
- package/dist/schema-registry.js.map +7 -1
- package/dist/server.js +69 -72
- package/dist/server.js.map +7 -1
- package/dist/service-registry.d.ts.map +1 -1
- package/dist/service-registry.js +60 -67
- package/dist/service-registry.js.map +7 -1
- package/dist/services/builtin-handlers.d.ts +4 -0
- package/dist/services/builtin-handlers.d.ts.map +1 -1
- package/dist/services/builtin-handlers.js +34 -20
- package/dist/services/builtin-handlers.js.map +7 -1
- package/dist/services/economy-handlers.js +143 -132
- package/dist/services/economy-handlers.js.map +7 -1
- package/dist/tx-runner.d.ts +35 -11
- package/dist/tx-runner.d.ts.map +1 -1
- package/dist/tx-runner.js +293 -250
- package/dist/tx-runner.js.map +7 -1
- package/dist/where.js +71 -94
- package/dist/where.js.map +7 -1
- package/package.json +4 -4
package/README.md
CHANGED
package/dist/db-tables.js
CHANGED
|
@@ -1,15 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
* - sfmc__audit — db.audit() 自动写入
|
|
6
|
-
* - sfmc__idempotent — db.idempotent() probe/commit 用
|
|
7
|
-
*
|
|
8
|
-
* 业务表(land / economy / coops / redpacket / ...)的 DDL 不在这里;
|
|
9
|
-
* 它们由各自模块在 init() 调 db.defineTable() 声明,schema-registry 统一建表。
|
|
10
|
-
*/
|
|
11
|
-
export function createPlatformTables(db) {
|
|
12
|
-
db.exec(/* sql */ `
|
|
1
|
+
function createPlatformTables(db) {
|
|
2
|
+
db.exec(
|
|
3
|
+
/* sql */
|
|
4
|
+
`
|
|
13
5
|
CREATE TABLE IF NOT EXISTS sfmc__audit (
|
|
14
6
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
15
7
|
module_id TEXT NOT NULL,
|
|
@@ -19,9 +11,12 @@ export function createPlatformTables(db) {
|
|
|
19
11
|
data TEXT,
|
|
20
12
|
created_at TEXT NOT NULL
|
|
21
13
|
)
|
|
22
|
-
`
|
|
23
|
-
|
|
24
|
-
|
|
14
|
+
`
|
|
15
|
+
);
|
|
16
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_sfmc__audit_module_table ON sfmc__audit(module_id, table_name)`);
|
|
17
|
+
db.exec(
|
|
18
|
+
/* sql */
|
|
19
|
+
`
|
|
25
20
|
CREATE TABLE IF NOT EXISTS sfmc__idempotent (
|
|
26
21
|
module_id TEXT NOT NULL,
|
|
27
22
|
action TEXT NOT NULL,
|
|
@@ -30,6 +25,10 @@ export function createPlatformTables(db) {
|
|
|
30
25
|
created_at TEXT NOT NULL,
|
|
31
26
|
PRIMARY KEY (module_id, action, key)
|
|
32
27
|
)
|
|
33
|
-
`
|
|
28
|
+
`
|
|
29
|
+
);
|
|
34
30
|
}
|
|
35
|
-
|
|
31
|
+
export {
|
|
32
|
+
createPlatformTables
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=db-tables.js.map
|
package/dist/db-tables.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/db-tables.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * db-tables.ts \u2014 \u5E73\u53F0\u81EA\u5E26\u6570\u636E\u5E93\u8868 bootstrap\n *\n * \u5E73\u53F0\u8868(\u4E0D\u662F\u6A21\u5757\u58F0\u660E\u7684):\n * - sfmc__audit \u2014 db.audit() \u81EA\u52A8\u5199\u5165\n * - sfmc__idempotent \u2014 db.idempotent() probe/commit \u7528\n *\n * \u4E1A\u52A1\u8868(land / economy / coops / redpacket / ...)\u7684 DDL \u4E0D\u5728\u8FD9\u91CC;\n * \u5B83\u4EEC\u7531\u5404\u81EA\u6A21\u5757\u5728 init() \u8C03 db.defineTable() \u58F0\u660E,schema-registry \u7EDF\u4E00\u5EFA\u8868\u3002\n */\n\nimport type { DatabaseSync } from \"node:sqlite\";\n\nexport function createPlatformTables(db: DatabaseSync): void {\n db.exec(/* sql */ `\n CREATE TABLE IF NOT EXISTS sfmc__audit (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n module_id TEXT NOT NULL,\n table_name TEXT NOT NULL,\n row_id TEXT NOT NULL,\n action TEXT NOT NULL,\n data TEXT,\n created_at TEXT NOT NULL\n )\n `);\n db.exec(`CREATE INDEX IF NOT EXISTS idx_sfmc__audit_module_table ON sfmc__audit(module_id, table_name)`);\n\n db.exec(/* sql */ `\n CREATE TABLE IF NOT EXISTS sfmc__idempotent (\n module_id TEXT NOT NULL,\n action TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT,\n created_at TEXT NOT NULL,\n PRIMARY KEY (module_id, action, key)\n )\n `);\n}\n"],
|
|
5
|
+
"mappings": "AAaO,SAAS,qBAAqB,IAAwB;AAC3D,KAAG;AAAA;AAAA,IAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUjB;AACD,KAAG,KAAK,+FAA+F;AAEvG,KAAG;AAAA;AAAA,IAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASjB;AACH;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/domain/bridge.js
CHANGED
|
@@ -1,82 +1,59 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* domain/bridge.ts — MC → QQ 桥接
|
|
3
|
-
*
|
|
4
|
-
* db-server 收到 SAPI 上报的消息后,直接调 LLBot HTTP `/send_group_msg`
|
|
5
|
-
* 把消息转发到 QQ 群。不再走中间 qq-bridge 进程。
|
|
6
|
-
*
|
|
7
|
-
* 数据流:
|
|
8
|
-
* SAPI ──POST──→ db-server:3001/api/sfmc/messages
|
|
9
|
-
* └─ 写库 + forwardToQQBridge() ──HTTP──→ LLBot:3004/send_group_msg
|
|
10
|
-
*
|
|
11
|
-
* 事务描述:
|
|
12
|
-
* - 无 DB 事务(本文件不操作 SQLite,只做 HTTP 出站转发)
|
|
13
|
-
*
|
|
14
|
-
* 领域函数:
|
|
15
|
-
* - makeLLBotConfig(env) 工厂:从 env 构造 LLBotConfig
|
|
16
|
-
* - forwardToQQBridge() 转发单条 MC 消息到 LLBot;失败仅 warn,不抛错
|
|
17
|
-
*/
|
|
18
1
|
import { request } from "node:http";
|
|
19
2
|
import { log } from "../lib/log.js";
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
token: env.LLBOT_TOKEN,
|
|
29
|
-
groupId: env.QQ_GROUP_ID,
|
|
30
|
-
prefix: "[MC]",
|
|
31
|
-
};
|
|
3
|
+
function makeLLBotConfig(env) {
|
|
4
|
+
return {
|
|
5
|
+
host: env.LLBOT_HOST,
|
|
6
|
+
port: env.LLBOT_PORT,
|
|
7
|
+
token: env.LLBOT_TOKEN,
|
|
8
|
+
groupId: env.QQ_GROUP_ID,
|
|
9
|
+
prefix: "[MC]"
|
|
10
|
+
};
|
|
32
11
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
12
|
+
function forwardToQQBridge(config, channelId, fromName, content, fromId) {
|
|
13
|
+
if (!config.groupId || config.groupId === "0") {
|
|
14
|
+
log.warn(`QQ \u7FA4\u672A\u914D\u7F6E (qq_group_id),\u8DF3\u8FC7 MC\u2192QQ \u8F6C\u53D1 (channel=${channelId})`);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const text = `${config.prefix} ${fromName}: ${content}`;
|
|
18
|
+
const payload = JSON.stringify({
|
|
19
|
+
group_id: parseInt(config.groupId, 10),
|
|
20
|
+
message: [{ type: "text", data: { text } }]
|
|
21
|
+
});
|
|
22
|
+
const headers = {
|
|
23
|
+
"Content-Type": "application/json",
|
|
24
|
+
"Content-Length": Buffer.byteLength(payload)
|
|
25
|
+
};
|
|
26
|
+
if (config.token) {
|
|
27
|
+
headers["Authorization"] = `Bearer ${config.token}`;
|
|
28
|
+
}
|
|
29
|
+
const req = request(
|
|
30
|
+
{
|
|
31
|
+
hostname: config.host,
|
|
32
|
+
port: config.port,
|
|
33
|
+
path: "/send_group_msg",
|
|
34
|
+
method: "POST",
|
|
35
|
+
headers
|
|
36
|
+
},
|
|
37
|
+
(res) => {
|
|
38
|
+
let body = "";
|
|
39
|
+
res.on("data", (c) => body += c);
|
|
40
|
+
res.on("end", () => {
|
|
41
|
+
if (res.statusCode !== 200) {
|
|
42
|
+
log.warn(
|
|
43
|
+
`LLBot send_group_msg \u2192 ${res.statusCode}: ${String(body).slice(0, 200)} (from=${fromId}, channel=${channelId})`
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
48
47
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
"Content-Type": "application/json",
|
|
56
|
-
"Content-Length": Buffer.byteLength(payload),
|
|
57
|
-
};
|
|
58
|
-
if (config.token) {
|
|
59
|
-
headers["Authorization"] = `Bearer ${config.token}`;
|
|
60
|
-
}
|
|
61
|
-
const req = request({
|
|
62
|
-
hostname: config.host,
|
|
63
|
-
port: config.port,
|
|
64
|
-
path: "/send_group_msg",
|
|
65
|
-
method: "POST",
|
|
66
|
-
headers,
|
|
67
|
-
}, (res) => {
|
|
68
|
-
let body = "";
|
|
69
|
-
res.on("data", (c) => (body += c));
|
|
70
|
-
res.on("end", () => {
|
|
71
|
-
if (res.statusCode !== 200) {
|
|
72
|
-
log.warn(`LLBot send_group_msg → ${res.statusCode}: ${String(body).slice(0, 200)} (from=${fromId}, channel=${channelId})`);
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
req.on("error", (err) => {
|
|
77
|
-
log.warn(`LLBot 不可达 (${config.host}:${config.port}): ${err.message}`);
|
|
78
|
-
});
|
|
79
|
-
req.write(payload);
|
|
80
|
-
req.end();
|
|
48
|
+
);
|
|
49
|
+
req.on("error", (err) => {
|
|
50
|
+
log.warn(`LLBot \u4E0D\u53EF\u8FBE (${config.host}:${config.port}): ${err.message}`);
|
|
51
|
+
});
|
|
52
|
+
req.write(payload);
|
|
53
|
+
req.end();
|
|
81
54
|
}
|
|
82
|
-
|
|
55
|
+
export {
|
|
56
|
+
forwardToQQBridge,
|
|
57
|
+
makeLLBotConfig
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=bridge.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/domain/bridge.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * domain/bridge.ts \u2014 MC \u2192 QQ \u6865\u63A5\n *\n * db-server \u6536\u5230 SAPI \u4E0A\u62A5\u7684\u6D88\u606F\u540E,\u76F4\u63A5\u8C03 LLBot HTTP `/send_group_msg`\n * \u628A\u6D88\u606F\u8F6C\u53D1\u5230 QQ \u7FA4\u3002\u4E0D\u518D\u8D70\u4E2D\u95F4 qq-bridge \u8FDB\u7A0B\u3002\n *\n * \u6570\u636E\u6D41:\n * SAPI \u2500\u2500POST\u2500\u2500\u2192 db-server:3001/api/sfmc/messages\n * \u2514\u2500 \u5199\u5E93 + forwardToQQBridge() \u2500\u2500HTTP\u2500\u2500\u2192 LLBot:3004/send_group_msg\n *\n * \u4E8B\u52A1\u63CF\u8FF0:\n * - \u65E0 DB \u4E8B\u52A1(\u672C\u6587\u4EF6\u4E0D\u64CD\u4F5C SQLite,\u53EA\u505A HTTP \u51FA\u7AD9\u8F6C\u53D1)\n *\n * \u9886\u57DF\u51FD\u6570:\n * - makeLLBotConfig(env) \u5DE5\u5382:\u4ECE env \u6784\u9020 LLBotConfig\n * - forwardToQQBridge() \u8F6C\u53D1\u5355\u6761 MC \u6D88\u606F\u5230 LLBot;\u5931\u8D25\u4EC5 warn,\u4E0D\u629B\u9519\n */\n\nimport { request } from \"node:http\";\n\nimport { log } from \"../lib/log.js\";\n\ntype LLBotConfig = {\n host: string;\n port: number;\n token: string;\n groupId: string;\n prefix: string;\n};\n\n/**\n * \u6784\u9020 LLBotConfig\u3002\u5141\u8BB8\u663E\u5F0F\u4F20\u5165(\u6D4B\u8BD5),\u9ED8\u8BA4\u4ECE env \u63A8\u4E0D\u51FA,\n * \u6240\u4EE5\u8C03\u7528\u65B9\u9700\u81EA\u5DF1\u628A env \u91CC\u8BFB\u5230\u7684\u503C\u4F20\u8FDB\u6765\u3002\n */\nexport function makeLLBotConfig(env: {\n LLBOT_HOST: string;\n LLBOT_PORT: number;\n LLBOT_TOKEN: string;\n QQ_GROUP_ID: string;\n}): LLBotConfig {\n return {\n host: env.LLBOT_HOST,\n port: env.LLBOT_PORT,\n token: env.LLBOT_TOKEN,\n groupId: env.QQ_GROUP_ID,\n prefix: \"[MC]\",\n };\n}\n\n/**\n * @description\n * @author Shiroha7z\n * @date 17/07/2026\n * @export\n * @param {LLBotConfig} config LLBot \u8FDE\u63A5\u4FE1\u606F(host/port/token/groupId/prefix)\n * @param {string} channelId MC \u9891\u9053 ID(\u7528\u4E8E\u8FC7\u6EE4 / \u6807\u8BB0,\u76EE\u524D\u4EC5\u505A\u65E5\u5FD7)\n * @param {string} fromName MC \u73A9\u5BB6\u540D\n * @param {string} content \u6D88\u606F\u6B63\u6587\n * @param {string} fromId MC \u73A9\u5BB6 ID\n */\nexport function forwardToQQBridge(\n config: LLBotConfig,\n channelId: string,\n fromName: string,\n content: string,\n fromId: string\n): void {\n if (!config.groupId || config.groupId === \"0\") {\n log.warn(`QQ \u7FA4\u672A\u914D\u7F6E (qq_group_id),\u8DF3\u8FC7 MC\u2192QQ \u8F6C\u53D1 (channel=${channelId})`);\n return;\n }\n\n const text = `${config.prefix} ${fromName}: ${content}`;\n const payload = JSON.stringify({\n group_id: parseInt(config.groupId, 10),\n message: [{ type: \"text\", data: { text } }],\n });\n\n const headers: Record<string, string | number> = {\n \"Content-Type\": \"application/json\",\n \"Content-Length\": Buffer.byteLength(payload),\n };\n if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n }\n\n const req = request(\n {\n hostname: config.host,\n port: config.port,\n path: \"/send_group_msg\",\n method: \"POST\",\n headers,\n },\n (res) => {\n let body = \"\";\n res.on(\"data\", (c) => (body += c));\n res.on(\"end\", () => {\n if (res.statusCode !== 200) {\n log.warn(\n `LLBot send_group_msg \u2192 ${res.statusCode}: ${String(body).slice(0, 200)} (from=${fromId}, channel=${channelId})`\n );\n }\n });\n }\n );\n req.on(\"error\", (err) => {\n log.warn(`LLBot \u4E0D\u53EF\u8FBE (${config.host}:${config.port}): ${err.message}`);\n });\n req.write(payload);\n req.end();\n}\n"],
|
|
5
|
+
"mappings": "AAkBA,SAAS,eAAe;AAExB,SAAS,WAAW;AAcb,SAAS,gBAAgB,KAKhB;AACd,SAAO;AAAA,IACL,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,OAAO,IAAI;AAAA,IACX,SAAS,IAAI;AAAA,IACb,QAAQ;AAAA,EACV;AACF;AAaO,SAAS,kBACd,QACA,WACA,UACA,SACA,QACM;AACN,MAAI,CAAC,OAAO,WAAW,OAAO,YAAY,KAAK;AAC7C,QAAI,KAAK,2FAA8C,SAAS,GAAG;AACnE;AAAA,EACF;AAEA,QAAM,OAAO,GAAG,OAAO,MAAM,IAAI,QAAQ,KAAK,OAAO;AACrD,QAAM,UAAU,KAAK,UAAU;AAAA,IAC7B,UAAU,SAAS,OAAO,SAAS,EAAE;AAAA,IACrC,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,EAAE,KAAK,EAAE,CAAC;AAAA,EAC5C,CAAC;AAED,QAAM,UAA2C;AAAA,IAC/C,gBAAgB;AAAA,IAChB,kBAAkB,OAAO,WAAW,OAAO;AAAA,EAC7C;AACA,MAAI,OAAO,OAAO;AAChB,YAAQ,eAAe,IAAI,UAAU,OAAO,KAAK;AAAA,EACnD;AAEA,QAAM,MAAM;AAAA,IACV;AAAA,MACE,UAAU,OAAO;AAAA,MACjB,MAAM,OAAO;AAAA,MACb,MAAM;AAAA,MACN,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,QAAQ;AACP,UAAI,OAAO;AACX,UAAI,GAAG,QAAQ,CAAC,MAAO,QAAQ,CAAE;AACjC,UAAI,GAAG,OAAO,MAAM;AAClB,YAAI,IAAI,eAAe,KAAK;AAC1B,cAAI;AAAA,YACF,+BAA0B,IAAI,UAAU,KAAK,OAAO,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,UAAU,MAAM,aAAa,SAAS;AAAA,UAC/G;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,MAAI,GAAG,SAAS,CAAC,QAAQ;AACvB,QAAI,KAAK,6BAAc,OAAO,IAAI,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO,EAAE;AAAA,EACtE,CAAC;AACD,MAAI,MAAM,OAAO;AACjB,MAAI,IAAI;AACV;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/domain/economy.d.ts
CHANGED
|
@@ -8,12 +8,56 @@
|
|
|
8
8
|
* - applyEconomySteps / submitDailyTaskSteps — 无 BEGIN/COMMIT,可嵌进外层 db.tx
|
|
9
9
|
* - applyEconomyTransaction / submitDailyTaskTx — 独立调用时自己开事务;
|
|
10
10
|
* alreadyInTx=true 时只跑 steps
|
|
11
|
+
*
|
|
12
|
+
* 行类型在此本地定义(平台不依赖业务模块包;权威副本在 sfmc-modules/packages/economy)。
|
|
11
13
|
*/
|
|
12
|
-
import type { EconomyAccountRow, EconomyTransactionRow } from "@sfmc-bds/sdk/contracts";
|
|
13
14
|
import type { DatabaseSync } from "node:sqlite";
|
|
14
15
|
import type { SQLStatement } from "sql-template-strings";
|
|
15
16
|
import type { TxResult } from "./transaction.js";
|
|
16
17
|
export type { TxResult };
|
|
18
|
+
/**
|
|
19
|
+
* 经济域行模型(原 SDK contracts/economy;契约内聚到表所有者 db-server)。
|
|
20
|
+
* 业务模块应通过 service(economy.*) 消费视图,不依赖这些内部行类型。
|
|
21
|
+
*/
|
|
22
|
+
export interface EconomyAccountRow {
|
|
23
|
+
player_id: string;
|
|
24
|
+
player_name_snapshot: string;
|
|
25
|
+
balance: number;
|
|
26
|
+
version: number;
|
|
27
|
+
created_at: number;
|
|
28
|
+
updated_at: number;
|
|
29
|
+
}
|
|
30
|
+
/** 幂等键表行 */
|
|
31
|
+
export interface EconomyIdempotencyRow {
|
|
32
|
+
actor_id: string;
|
|
33
|
+
idempotency_key: string;
|
|
34
|
+
transaction_id: string;
|
|
35
|
+
response_json: string;
|
|
36
|
+
created_at: number;
|
|
37
|
+
}
|
|
38
|
+
/** 流水表行 */
|
|
39
|
+
export interface EconomyTransactionRow {
|
|
40
|
+
id: string;
|
|
41
|
+
transaction_type: string;
|
|
42
|
+
actor_id: string;
|
|
43
|
+
source_player_id?: string;
|
|
44
|
+
target_player_id?: string;
|
|
45
|
+
amount: number;
|
|
46
|
+
balance_before?: number;
|
|
47
|
+
balance_after?: number;
|
|
48
|
+
reference_type: string;
|
|
49
|
+
reference_id: string;
|
|
50
|
+
reason: string;
|
|
51
|
+
created_at: number;
|
|
52
|
+
idempotency_key: string;
|
|
53
|
+
/** JS-side alias fields used by domain/economy.ts */
|
|
54
|
+
actorId?: string;
|
|
55
|
+
type?: string;
|
|
56
|
+
referenceType?: string;
|
|
57
|
+
referenceId?: string;
|
|
58
|
+
sourcePlayerName?: string;
|
|
59
|
+
targetPlayerName?: string;
|
|
60
|
+
}
|
|
17
61
|
/** query 兼容格式:string / SQLStatement / { sql, values } */
|
|
18
62
|
export type AnyQuery = (sql: string | SQLStatement | {
|
|
19
63
|
sql: string;
|
|
@@ -21,6 +65,44 @@ export type AnyQuery = (sql: string | SQLStatement | {
|
|
|
21
65
|
}, values?: unknown[]) => unknown[] | {
|
|
22
66
|
changes: number | bigint;
|
|
23
67
|
};
|
|
68
|
+
/**
|
|
69
|
+
* 经济账户 DB 行(snake_case,对应 sfmc_economy_accounts)。
|
|
70
|
+
* 业务域类型由本模块维护,不再依赖 sdk/contracts。
|
|
71
|
+
*/
|
|
72
|
+
export interface EconomyAccountRow {
|
|
73
|
+
player_id: string;
|
|
74
|
+
player_name_snapshot: string;
|
|
75
|
+
balance: number;
|
|
76
|
+
version: number;
|
|
77
|
+
created_at: number;
|
|
78
|
+
updated_at: number;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 经济交易流水 DB 行(snake_case,对应 sfmc_economy_transactions)。
|
|
82
|
+
* 含历史 JS 侧别名字段,供调用方兼容读取。
|
|
83
|
+
*/
|
|
84
|
+
export interface EconomyTransactionRow {
|
|
85
|
+
id: string;
|
|
86
|
+
transaction_type: string;
|
|
87
|
+
actor_id: string;
|
|
88
|
+
source_player_id?: string;
|
|
89
|
+
target_player_id?: string;
|
|
90
|
+
amount: number;
|
|
91
|
+
balance_before?: number;
|
|
92
|
+
balance_after?: number;
|
|
93
|
+
reference_type: string;
|
|
94
|
+
reference_id: string;
|
|
95
|
+
reason: string;
|
|
96
|
+
created_at: number;
|
|
97
|
+
idempotency_key: string;
|
|
98
|
+
/** JS-side alias fields used by domain/economy.ts */
|
|
99
|
+
actorId?: string;
|
|
100
|
+
type?: string;
|
|
101
|
+
referenceType?: string;
|
|
102
|
+
referenceId?: string;
|
|
103
|
+
sourcePlayerName?: string;
|
|
104
|
+
targetPlayerName?: string;
|
|
105
|
+
}
|
|
24
106
|
export interface EconomyAccountView {
|
|
25
107
|
playerId: string;
|
|
26
108
|
playerName: string;
|
|
@@ -82,7 +164,6 @@ export declare function applyEconomySteps(query: AnyQuery, data: ApplyEconomyInp
|
|
|
82
164
|
export declare function applyEconomyTransaction(query: AnyQuery, db: DatabaseSync, data: ApplyEconomyInput, opts?: {
|
|
83
165
|
alreadyInTx?: boolean;
|
|
84
166
|
}): ApplyEconomyResult;
|
|
85
|
-
export type { EconomyAccountRow, EconomyTransactionRow };
|
|
86
167
|
/** 列出日常任务(默认仅 active 且未过期) */
|
|
87
168
|
export declare function listDailyTasks(query: AnyQuery, filter?: {
|
|
88
169
|
status?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"economy.d.ts","sourceRoot":"","sources":["../../src/domain/economy.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"economy.d.ts","sourceRoot":"","sources":["../../src/domain/economy.ts"],"names":[],"mappings":"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"}
|