@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.
Files changed (63) hide show
  1. package/dist/domain/activity-log.d.ts +129 -0
  2. package/dist/domain/activity-log.d.ts.map +1 -0
  3. package/dist/domain/activity-log.js +186 -0
  4. package/dist/domain/activity-log.js.map +7 -0
  5. package/dist/domain/bind-providers.d.ts +59 -0
  6. package/dist/domain/bind-providers.d.ts.map +1 -0
  7. package/dist/domain/bind-providers.js +33 -0
  8. package/dist/domain/bind-providers.js.map +7 -0
  9. package/dist/domain/metrics.d.ts +5 -0
  10. package/dist/domain/metrics.d.ts.map +1 -1
  11. package/dist/domain/metrics.js +28 -2
  12. package/dist/domain/metrics.js.map +2 -2
  13. package/dist/domain/player-level.d.ts +29 -0
  14. package/dist/domain/player-level.d.ts.map +1 -0
  15. package/dist/domain/player-level.js +30 -0
  16. package/dist/domain/player-level.js.map +7 -0
  17. package/dist/domain/process-resources.d.ts +12 -0
  18. package/dist/domain/process-resources.d.ts.map +1 -1
  19. package/dist/domain/process-resources.js +72 -1
  20. package/dist/domain/process-resources.js.map +2 -2
  21. package/dist/domain/qq-bind.d.ts +21 -0
  22. package/dist/domain/qq-bind.d.ts.map +1 -0
  23. package/dist/domain/qq-bind.js +54 -0
  24. package/dist/domain/qq-bind.js.map +7 -0
  25. package/dist/domain/schema.d.ts +1 -0
  26. package/dist/domain/schema.d.ts.map +1 -1
  27. package/dist/domain/schema.js +26 -0
  28. package/dist/domain/schema.js.map +2 -2
  29. package/dist/domain/tracked-processes.d.ts +30 -0
  30. package/dist/domain/tracked-processes.d.ts.map +1 -0
  31. package/dist/domain/tracked-processes.js +78 -0
  32. package/dist/domain/tracked-processes.js.map +7 -0
  33. package/dist/domain/wechat-bind.d.ts +56 -0
  34. package/dist/domain/wechat-bind.d.ts.map +1 -0
  35. package/dist/domain/wechat-bind.js +84 -0
  36. package/dist/domain/wechat-bind.js.map +7 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +40 -7
  39. package/dist/index.js.map +2 -2
  40. package/dist/lib/sqlite.d.ts +10 -0
  41. package/dist/lib/sqlite.d.ts.map +1 -1
  42. package/dist/lib/sqlite.js +17 -2
  43. package/dist/lib/sqlite.js.map +2 -2
  44. package/dist/routes/bind-confirm.d.ts +30 -0
  45. package/dist/routes/bind-confirm.d.ts.map +1 -0
  46. package/dist/routes/bind-confirm.js +27 -0
  47. package/dist/routes/bind-confirm.js.map +7 -0
  48. package/dist/routes/qq-bind.d.ts +3 -1
  49. package/dist/routes/qq-bind.d.ts.map +1 -1
  50. package/dist/routes/qq-bind.js +8 -64
  51. package/dist/routes/qq-bind.js.map +2 -2
  52. package/dist/routes/status.d.ts.map +1 -1
  53. package/dist/routes/status.js +10 -2
  54. package/dist/routes/status.js.map +2 -2
  55. package/dist/routes/wechat-activity.d.ts +32 -0
  56. package/dist/routes/wechat-activity.d.ts.map +1 -0
  57. package/dist/routes/wechat-activity.js +40 -0
  58. package/dist/routes/wechat-activity.js.map +7 -0
  59. package/dist/routes/wechat-bind.d.ts +39 -0
  60. package/dist/routes/wechat-bind.d.ts.map +1 -0
  61. package/dist/routes/wechat-bind.js +56 -0
  62. package/dist/routes/wechat-bind.js.map +7 -0
  63. 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.5.3",
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.2.10",
54
- "@sfmc-bds/sdk": "0.5.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.10"
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
  }