@sfmc-bds/db-server 0.5.3 → 0.7.0
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/dist/domain/activity-log.d.ts +129 -0
- package/dist/domain/activity-log.d.ts.map +1 -0
- package/dist/domain/activity-log.js +186 -0
- package/dist/domain/activity-log.js.map +7 -0
- package/dist/domain/bind-providers.d.ts +59 -0
- package/dist/domain/bind-providers.d.ts.map +1 -0
- package/dist/domain/bind-providers.js +33 -0
- package/dist/domain/bind-providers.js.map +7 -0
- package/dist/domain/metrics.d.ts +5 -0
- package/dist/domain/metrics.d.ts.map +1 -1
- package/dist/domain/metrics.js +28 -2
- package/dist/domain/metrics.js.map +2 -2
- package/dist/domain/player-level.d.ts +29 -0
- package/dist/domain/player-level.d.ts.map +1 -0
- package/dist/domain/player-level.js +30 -0
- package/dist/domain/player-level.js.map +7 -0
- package/dist/domain/process-resources.d.ts +12 -0
- package/dist/domain/process-resources.d.ts.map +1 -1
- package/dist/domain/process-resources.js +72 -1
- package/dist/domain/process-resources.js.map +2 -2
- package/dist/domain/qq-bind.d.ts +21 -0
- package/dist/domain/qq-bind.d.ts.map +1 -0
- package/dist/domain/qq-bind.js +54 -0
- package/dist/domain/qq-bind.js.map +7 -0
- package/dist/domain/schema.d.ts +1 -0
- package/dist/domain/schema.d.ts.map +1 -1
- package/dist/domain/schema.js +26 -0
- package/dist/domain/schema.js.map +2 -2
- package/dist/domain/tracked-processes.d.ts +30 -0
- package/dist/domain/tracked-processes.d.ts.map +1 -0
- package/dist/domain/tracked-processes.js +78 -0
- package/dist/domain/tracked-processes.js.map +7 -0
- package/dist/domain/wechat-bind.d.ts +56 -0
- package/dist/domain/wechat-bind.d.ts.map +1 -0
- package/dist/domain/wechat-bind.js +84 -0
- package/dist/domain/wechat-bind.js.map +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -7
- package/dist/index.js.map +2 -2
- package/dist/lib/sqlite.d.ts +10 -0
- package/dist/lib/sqlite.d.ts.map +1 -1
- package/dist/lib/sqlite.js +17 -2
- package/dist/lib/sqlite.js.map +2 -2
- package/dist/routes/bind-confirm.d.ts +30 -0
- package/dist/routes/bind-confirm.d.ts.map +1 -0
- package/dist/routes/bind-confirm.js +27 -0
- package/dist/routes/bind-confirm.js.map +7 -0
- package/dist/routes/qq-bind.d.ts +3 -1
- package/dist/routes/qq-bind.d.ts.map +1 -1
- package/dist/routes/qq-bind.js +8 -64
- package/dist/routes/qq-bind.js.map +2 -2
- package/dist/routes/status.d.ts.map +1 -1
- package/dist/routes/status.js +10 -2
- package/dist/routes/status.js.map +2 -2
- package/dist/routes/wechat-activity.d.ts +32 -0
- package/dist/routes/wechat-activity.d.ts.map +1 -0
- package/dist/routes/wechat-activity.js +40 -0
- package/dist/routes/wechat-activity.js.map +7 -0
- package/dist/routes/wechat-bind.d.ts +39 -0
- package/dist/routes/wechat-bind.d.ts.map +1 -0
- package/dist/routes/wechat-bind.js +56 -0
- package/dist/routes/wechat-bind.js.map +7 -0
- package/package.json +10 -4
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { loadQqAccountProfile } from "../domain/qq-account-profile.js";
|
|
2
|
+
import { currentPlayerName, findWechatBindingByOpenid, requestWechatBindCode, unbindWechat } from "../domain/wechat-bind.js";
|
|
3
|
+
const PREFIX = "/api/sfmc/wechat/bind";
|
|
4
|
+
function createWechatBindRoutes({ query, body, json, isCodeTaken, resolveLevel }) {
|
|
5
|
+
return async function handle({ path, method, params, req, res }) {
|
|
6
|
+
if (!path.startsWith(PREFIX)) return false;
|
|
7
|
+
if (path === `${PREFIX}/me` && method === "GET") {
|
|
8
|
+
const openid = String(params.get("openid") ?? "").trim();
|
|
9
|
+
if (!openid) {
|
|
10
|
+
json(res, { success: false, error: "openid_required" }, 400);
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
const binding = findWechatBindingByOpenid(query, openid);
|
|
14
|
+
if (!binding) {
|
|
15
|
+
json(res, { success: true, bound: false, binding: null });
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
const name = currentPlayerName(query, binding.player_xuid, binding.player_name);
|
|
19
|
+
json(res, {
|
|
20
|
+
success: true,
|
|
21
|
+
bound: true,
|
|
22
|
+
binding: { ...binding, player_name: name },
|
|
23
|
+
level: resolveLevel({ xuid: binding.player_xuid, name }),
|
|
24
|
+
profile: loadQqAccountProfile(query, binding.player_xuid, name)
|
|
25
|
+
});
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
if (path === `${PREFIX}/request` && method === "POST") {
|
|
29
|
+
const openid = String((await body(req)).openid ?? "").trim();
|
|
30
|
+
if (!openid) {
|
|
31
|
+
json(res, { success: false, error: "openid_required" }, 400);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
const result = requestWechatBindCode(query, openid, isCodeTaken);
|
|
35
|
+
if (result.ok) json(res, { success: true, code: result.code, expires_at: result.expires_at, ttl_ms: result.ttl_ms });
|
|
36
|
+
else json(res, { success: false, error: result.error, ...result.player_name ? { player_name: result.player_name } : {} }, result.status);
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
if (path === `${PREFIX}/unbind` && method === "POST") {
|
|
40
|
+
const openid = String((await body(req)).openid ?? "").trim();
|
|
41
|
+
if (!openid) {
|
|
42
|
+
json(res, { success: false, error: "openid_required" }, 400);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
const removed = unbindWechat(query, openid);
|
|
46
|
+
json(res, { success: true, unbound: removed > 0, removed });
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
json(res, { success: false, error: "not_found" }, 404);
|
|
50
|
+
return true;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export {
|
|
54
|
+
createWechatBindRoutes
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=wechat-bind.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/routes/wechat-bind.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * routes/wechat-bind.ts \u2014 \u5FAE\u4FE1\u2194MC \u8EAB\u4EFD\u7ED1\u5B9A\uFF08\u5E73\u53F0 HTTP\uFF0C\u4EC5\u672C\u673A\uFF09\n *\n * POST /api/sfmc/wechat/bind/request \u2014 mp-gateway \u4EE3\u5C0F\u7A0B\u5E8F\u73A9\u5BB6\u7533\u8BF7\u77ED\u7801 { openid }\n * POST /api/sfmc/wechat/bind/unbind \u2014 \u89E3\u7ED1 { openid }\n * GET /api/sfmc/wechat/bind/me \u2014 \u67E5\u8BE2 ?openid=\uFF1A\u7ED1\u5B9A\u3001\u8D26\u53F7\u8D44\u6599\u4E0E SFMC \u6709\u6548\u7B49\u7EA7\n *\n * \u6E38\u620F\u4FA7\u786E\u8BA4\u8D70\u7EDF\u4E00\u5165\u53E3 POST /api/sfmc/bind/confirm\uFF08routes/bind-confirm.ts\uFF09\u3002\n * openid \u7531 mp-gateway \u901A\u8FC7\u5FAE\u4FE1 code2session \u53D6\u5F97\uFF0Cdb-server \u53EA\u4FE1\u4EFB\u672C\u673A\u8C03\u7528\u65B9\uFF08\u4E0E QQ \u7ED1\u5B9A\u8DEF\u7531\u540C\u4E00\u4FE1\u4EFB\u8FB9\u754C\uFF09\u3002\n */\n\nimport type http from \"node:http\";\nimport { loadQqAccountProfile } from \"../domain/qq-account-profile.js\";\nimport { currentPlayerName, findWechatBindingByOpenid, requestWechatBindCode, unbindWechat } from \"../domain/wechat-bind.js\";\nimport type { QueryFn } from \"../lib/sqlite.js\";\n\ninterface Deps {\n query: QueryFn;\n body: (req: http.IncomingMessage) => Promise<Record<string, unknown>>;\n json: (res: http.ServerResponse, data: Record<string, unknown>, status?: number) => void;\n /** \u8DE8\u6E20\u9053\u77ED\u7801\u67E5\u91CD\uFF08QQ + \u5FAE\u4FE1\uFF09 */\n isCodeTaken: (code: string) => boolean;\n /** \u6309 xuid / \u73A9\u5BB6\u540D\u8BA1\u7B97 SFMC \u6709\u6548\u7B49\u7EA7\uFF08DIP\uFF1A\u6587\u4EF6\u4F4D\u7F6E\u7531\u5165\u53E3\u51B3\u5B9A\uFF09 */\n resolveLevel: (player: { xuid: string; name: string }) => number;\n}\n\n/** \u8DEF\u7531\u4E0A\u4E0B\u6587\uFF08\u4E0E\u5176\u4ED6\u5E73\u53F0\u8DEF\u7531\u4E00\u81F4\uFF09 */\ninterface Ctx {\n path: string;\n method: string;\n params: URLSearchParams;\n req: http.IncomingMessage;\n res: http.ServerResponse;\n}\n\nconst PREFIX = \"/api/sfmc/wechat/bind\";\n\n/**\n * \u521B\u5EFA\u5FAE\u4FE1\u7ED1\u5B9A\u8DEF\u7531\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1Aindex.ts \u88C5\u914D\u5230\u5E73\u53F0\u8DEF\u7531\u94FE\u3002\n */\nfunction createWechatBindRoutes({ query, body, json, isCodeTaken, resolveLevel }: Deps) {\n return async function handle({ path, method, params, req, res }: Ctx): Promise<boolean> {\n if (!path.startsWith(PREFIX)) return false;\n\n if (path === `${PREFIX}/me` && method === \"GET\") {\n const openid = String(params.get(\"openid\") ?? \"\").trim();\n if (!openid) {\n json(res, { success: false, error: \"openid_required\" }, 400);\n return true;\n }\n const binding = findWechatBindingByOpenid(query, openid);\n if (!binding) {\n json(res, { success: true, bound: false, binding: null });\n return true;\n }\n const name = currentPlayerName(query, binding.player_xuid, binding.player_name);\n json(res, {\n success: true,\n bound: true,\n binding: { ...binding, player_name: name },\n level: resolveLevel({ xuid: binding.player_xuid, name }),\n profile: loadQqAccountProfile(query, binding.player_xuid, name),\n });\n return true;\n }\n\n if (path === `${PREFIX}/request` && method === \"POST\") {\n const openid = String((await body(req)).openid ?? \"\").trim();\n if (!openid) {\n json(res, { success: false, error: \"openid_required\" }, 400);\n return true;\n }\n const result = requestWechatBindCode(query, openid, isCodeTaken);\n if (result.ok) json(res, { success: true, code: result.code, expires_at: result.expires_at, ttl_ms: result.ttl_ms });\n else json(res, { success: false, error: result.error, ...(result.player_name ? { player_name: result.player_name } : {}) }, result.status);\n return true;\n }\n\n if (path === `${PREFIX}/unbind` && method === \"POST\") {\n const openid = String((await body(req)).openid ?? \"\").trim();\n if (!openid) {\n json(res, { success: false, error: \"openid_required\" }, 400);\n return true;\n }\n const removed = unbindWechat(query, openid);\n json(res, { success: true, unbound: removed > 0, removed });\n return true;\n }\n\n json(res, { success: false, error: \"not_found\" }, 404);\n return true;\n };\n}\n\nexport { createWechatBindRoutes };\n"],
|
|
5
|
+
"mappings": "AAYA,SAAS,4BAA4B;AACrC,SAAS,mBAAmB,2BAA2B,uBAAuB,oBAAoB;AAsBlG,MAAM,SAAS;AAMf,SAAS,uBAAuB,EAAE,OAAO,MAAM,MAAM,aAAa,aAAa,GAAS;AACtF,SAAO,eAAe,OAAO,EAAE,MAAM,QAAQ,QAAQ,KAAK,IAAI,GAA0B;AACtF,QAAI,CAAC,KAAK,WAAW,MAAM,EAAG,QAAO;AAErC,QAAI,SAAS,GAAG,MAAM,SAAS,WAAW,OAAO;AAC/C,YAAM,SAAS,OAAO,OAAO,IAAI,QAAQ,KAAK,EAAE,EAAE,KAAK;AACvD,UAAI,CAAC,QAAQ;AACX,aAAK,KAAK,EAAE,SAAS,OAAO,OAAO,kBAAkB,GAAG,GAAG;AAC3D,eAAO;AAAA,MACT;AACA,YAAM,UAAU,0BAA0B,OAAO,MAAM;AACvD,UAAI,CAAC,SAAS;AACZ,aAAK,KAAK,EAAE,SAAS,MAAM,OAAO,OAAO,SAAS,KAAK,CAAC;AACxD,eAAO;AAAA,MACT;AACA,YAAM,OAAO,kBAAkB,OAAO,QAAQ,aAAa,QAAQ,WAAW;AAC9E,WAAK,KAAK;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,EAAE,GAAG,SAAS,aAAa,KAAK;AAAA,QACzC,OAAO,aAAa,EAAE,MAAM,QAAQ,aAAa,KAAK,CAAC;AAAA,QACvD,SAAS,qBAAqB,OAAO,QAAQ,aAAa,IAAI;AAAA,MAChE,CAAC;AACD,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,GAAG,MAAM,cAAc,WAAW,QAAQ;AACrD,YAAM,SAAS,QAAQ,MAAM,KAAK,GAAG,GAAG,UAAU,EAAE,EAAE,KAAK;AAC3D,UAAI,CAAC,QAAQ;AACX,aAAK,KAAK,EAAE,SAAS,OAAO,OAAO,kBAAkB,GAAG,GAAG;AAC3D,eAAO;AAAA,MACT;AACA,YAAM,SAAS,sBAAsB,OAAO,QAAQ,WAAW;AAC/D,UAAI,OAAO,GAAI,MAAK,KAAK,EAAE,SAAS,MAAM,MAAM,OAAO,MAAM,YAAY,OAAO,YAAY,QAAQ,OAAO,OAAO,CAAC;AAAA,UAC9G,MAAK,KAAK,EAAE,SAAS,OAAO,OAAO,OAAO,OAAO,GAAI,OAAO,cAAc,EAAE,aAAa,OAAO,YAAY,IAAI,CAAC,EAAG,GAAG,OAAO,MAAM;AACzI,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,GAAG,MAAM,aAAa,WAAW,QAAQ;AACpD,YAAM,SAAS,QAAQ,MAAM,KAAK,GAAG,GAAG,UAAU,EAAE,EAAE,KAAK;AAC3D,UAAI,CAAC,QAAQ;AACX,aAAK,KAAK,EAAE,SAAS,OAAO,OAAO,kBAAkB,GAAG,GAAG;AAC3D,eAAO;AAAA,MACT;AACA,YAAM,UAAU,aAAa,OAAO,MAAM;AAC1C,WAAK,KAAK,EAAE,SAAS,MAAM,SAAS,UAAU,GAAG,QAAQ,CAAC;AAC1D,aAAO;AAAA,IACT;AAEA,SAAK,KAAK,EAAE,SAAS,OAAO,OAAO,YAAY,GAAG,GAAG;AACrD,WAAO;AAAA,EACT;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sfmc-bds/db-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "SFMC SQLite HTTP REST backend — configs, modules, gameplay data",
|
|
5
5
|
"author": "Shiroha7z",
|
|
6
6
|
"license": "AGPL-3.0-only",
|
|
@@ -42,6 +42,11 @@
|
|
|
42
42
|
"import": "./dist/domain/qq-bindings.js",
|
|
43
43
|
"default": "./dist/domain/qq-bindings.js"
|
|
44
44
|
},
|
|
45
|
+
"./activity-log": {
|
|
46
|
+
"types": "./dist/domain/activity-log.d.ts",
|
|
47
|
+
"import": "./dist/domain/activity-log.js",
|
|
48
|
+
"default": "./dist/domain/activity-log.js"
|
|
49
|
+
},
|
|
45
50
|
"./package.json": "./package.json"
|
|
46
51
|
},
|
|
47
52
|
"files": [
|
|
@@ -50,11 +55,11 @@
|
|
|
50
55
|
],
|
|
51
56
|
"dependencies": {
|
|
52
57
|
"sql-template-strings": "^2.2.2",
|
|
53
|
-
"@sfmc-bds/bds-tools": "0.
|
|
54
|
-
"@sfmc-bds/sdk": "0.
|
|
58
|
+
"@sfmc-bds/bds-tools": "0.3.0",
|
|
59
|
+
"@sfmc-bds/sdk": "0.6.0"
|
|
55
60
|
},
|
|
56
61
|
"devDependencies": {
|
|
57
|
-
"@sfmc-bds/tools": "0.2.
|
|
62
|
+
"@sfmc-bds/tools": "0.2.11"
|
|
58
63
|
},
|
|
59
64
|
"publishConfig": {
|
|
60
65
|
"access": "public",
|
|
@@ -66,6 +71,7 @@
|
|
|
66
71
|
"dev": "tsx src/index.ts",
|
|
67
72
|
"format": "prettier --write \"src/**/*.{ts,tsx,js,json}\"",
|
|
68
73
|
"start": "node dist/index.js",
|
|
74
|
+
"test": "node --test --import tsx/esm test/*.test.ts",
|
|
69
75
|
"typecheck": "tsc7 --noEmit"
|
|
70
76
|
}
|
|
71
77
|
}
|