aifastdb 2.2.6 → 2.2.7
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/aifastdb.win32-x64-msvc.node +0 -0
- package/dist/carpool/benchmark.d.ts +9 -0
- package/dist/carpool/benchmark.d.ts.map +1 -0
- package/dist/carpool/benchmark.js +310 -0
- package/dist/carpool/benchmark.js.map +1 -0
- package/dist/carpool/carpool-credit.d.ts +124 -0
- package/dist/carpool/carpool-credit.d.ts.map +1 -0
- package/dist/carpool/carpool-credit.js +202 -0
- package/dist/carpool/carpool-credit.js.map +1 -0
- package/dist/carpool/carpool-index.d.ts +71 -0
- package/dist/carpool/carpool-index.d.ts.map +1 -0
- package/dist/carpool/carpool-index.js +203 -0
- package/dist/carpool/carpool-index.js.map +1 -0
- package/dist/carpool/carpool-matcher.d.ts +48 -0
- package/dist/carpool/carpool-matcher.d.ts.map +1 -0
- package/dist/carpool/carpool-matcher.js +133 -0
- package/dist/carpool/carpool-matcher.js.map +1 -0
- package/dist/carpool/carpool-matcher.test.d.ts +9 -0
- package/dist/carpool/carpool-matcher.test.d.ts.map +1 -0
- package/dist/carpool/carpool-matcher.test.js +403 -0
- package/dist/carpool/carpool-matcher.test.js.map +1 -0
- package/dist/carpool/carpool-privacy.d.ts +72 -0
- package/dist/carpool/carpool-privacy.d.ts.map +1 -0
- package/dist/carpool/carpool-privacy.js +171 -0
- package/dist/carpool/carpool-privacy.js.map +1 -0
- package/dist/carpool/carpool-repo.d.ts +175 -0
- package/dist/carpool/carpool-repo.d.ts.map +1 -0
- package/dist/carpool/carpool-repo.js +698 -0
- package/dist/carpool/carpool-repo.js.map +1 -0
- package/dist/carpool/carpool-repo.test.d.ts +9 -0
- package/dist/carpool/carpool-repo.test.d.ts.map +1 -0
- package/dist/carpool/carpool-repo.test.js +452 -0
- package/dist/carpool/carpool-repo.test.js.map +1 -0
- package/dist/carpool/carpool-scheduler.d.ts +68 -0
- package/dist/carpool/carpool-scheduler.d.ts.map +1 -0
- package/dist/carpool/carpool-scheduler.js +114 -0
- package/dist/carpool/carpool-scheduler.js.map +1 -0
- package/dist/carpool/carpool-service.d.ts +105 -0
- package/dist/carpool/carpool-service.d.ts.map +1 -0
- package/dist/carpool/carpool-service.js +372 -0
- package/dist/carpool/carpool-service.js.map +1 -0
- package/dist/carpool/carpool-service.test.d.ts +9 -0
- package/dist/carpool/carpool-service.test.d.ts.map +1 -0
- package/dist/carpool/carpool-service.test.js +455 -0
- package/dist/carpool/carpool-service.test.js.map +1 -0
- package/dist/carpool/carpool-test.d.ts +11 -0
- package/dist/carpool/carpool-test.d.ts.map +1 -0
- package/dist/carpool/carpool-test.js +387 -0
- package/dist/carpool/carpool-test.js.map +1 -0
- package/dist/carpool/index.d.ts +42 -0
- package/dist/carpool/index.d.ts.map +1 -0
- package/dist/carpool/index.js +80 -0
- package/dist/carpool/index.js.map +1 -0
- package/dist/carpool/privacy-guard.d.ts +69 -0
- package/dist/carpool/privacy-guard.d.ts.map +1 -0
- package/dist/carpool/privacy-guard.js +211 -0
- package/dist/carpool/privacy-guard.js.map +1 -0
- package/dist/carpool/report-system.d.ts +106 -0
- package/dist/carpool/report-system.d.ts.map +1 -0
- package/dist/carpool/report-system.js +212 -0
- package/dist/carpool/report-system.js.map +1 -0
- package/dist/carpool/trip-index.d.ts +73 -0
- package/dist/carpool/trip-index.d.ts.map +1 -0
- package/dist/carpool/trip-index.js +269 -0
- package/dist/carpool/trip-index.js.map +1 -0
- package/dist/carpool/trip-scheduler.d.ts +71 -0
- package/dist/carpool/trip-scheduler.d.ts.map +1 -0
- package/dist/carpool/trip-scheduler.js +126 -0
- package/dist/carpool/trip-scheduler.js.map +1 -0
- package/dist/carpool/trust-evaluator.d.ts +27 -0
- package/dist/carpool/trust-evaluator.d.ts.map +1 -0
- package/dist/carpool/trust-evaluator.js +117 -0
- package/dist/carpool/trust-evaluator.js.map +1 -0
- package/dist/carpool/types.d.ts +353 -0
- package/dist/carpool/types.d.ts.map +1 -0
- package/dist/carpool/types.js +71 -0
- package/dist/carpool/types.js.map +1 -0
- package/dist/carpool/validators.d.ts +25 -0
- package/dist/carpool/validators.d.ts.map +1 -0
- package/dist/carpool/validators.js +192 -0
- package/dist/carpool/validators.js.map +1 -0
- package/dist/carpool/vehicle.test.d.ts +8 -0
- package/dist/carpool/vehicle.test.d.ts.map +1 -0
- package/dist/carpool/vehicle.test.js +540 -0
- package/dist/carpool/vehicle.test.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -1
- package/dist/index.js.map +1 -1
- package/dist/social-graph-v2.d.ts +7 -0
- package/dist/social-graph-v2.d.ts.map +1 -1
- package/dist/social-graph-v2.js +10 -0
- package/dist/social-graph-v2.js.map +1 -1
- package/dist/social-graph.d.ts.map +1 -1
- package/dist/social-graph.js +2 -0
- package/dist/social-graph.js.map +1 -1
- package/dist/social-types.d.ts +4 -0
- package/dist/social-types.d.ts.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Carpool Module - Integration Test
|
|
5
|
+
*
|
|
6
|
+
* 顺风车模块完整集成测试。
|
|
7
|
+
* 使用真实的 SocialGraphV2 实例验证全流程。
|
|
8
|
+
*
|
|
9
|
+
* 运行方式: npx ts-node packages/node/ts/carpool/carpool-test.ts
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
const os = __importStar(require("os"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
const social_graph_v2_1 = require("../social-graph-v2");
|
|
49
|
+
const carpool_service_1 = require("./carpool-service");
|
|
50
|
+
const types_1 = require("./types");
|
|
51
|
+
// ============================================================================
|
|
52
|
+
// Test Utilities
|
|
53
|
+
// ============================================================================
|
|
54
|
+
let passed = 0;
|
|
55
|
+
let failed = 0;
|
|
56
|
+
const failures = [];
|
|
57
|
+
function assert(condition, message) {
|
|
58
|
+
if (condition) {
|
|
59
|
+
passed++;
|
|
60
|
+
console.log(` ✅ ${message}`);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
failed++;
|
|
64
|
+
failures.push(message);
|
|
65
|
+
console.log(` ❌ ${message}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function assertThrows(fn, expectedCode, message) {
|
|
69
|
+
try {
|
|
70
|
+
fn();
|
|
71
|
+
failed++;
|
|
72
|
+
failures.push(`${message} (未抛出异常)`);
|
|
73
|
+
console.log(` ❌ ${message} (未抛出异常)`);
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
if (e instanceof types_1.CarpoolError && e.code === expectedCode) {
|
|
77
|
+
passed++;
|
|
78
|
+
console.log(` ✅ ${message}`);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
failed++;
|
|
82
|
+
failures.push(`${message} (错误码不匹配: ${e instanceof types_1.CarpoolError ? e.code : e})`);
|
|
83
|
+
console.log(` ❌ ${message} (错误码不匹配: ${e instanceof types_1.CarpoolError ? e.code : e})`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function section(title) {
|
|
88
|
+
console.log(`\n━━━ ${title} ━━━`);
|
|
89
|
+
}
|
|
90
|
+
// ============================================================================
|
|
91
|
+
// Setup
|
|
92
|
+
// ============================================================================
|
|
93
|
+
const testDir = path.join(os.tmpdir(), 'carpool-test-' + Date.now());
|
|
94
|
+
fs.mkdirSync(testDir, { recursive: true });
|
|
95
|
+
console.log('=== 顺风车模块集成测试 ===');
|
|
96
|
+
console.log(`测试数据目录: ${testDir}\n`);
|
|
97
|
+
const graph = new social_graph_v2_1.SocialGraphV2({
|
|
98
|
+
path: testDir,
|
|
99
|
+
shardCount: 2,
|
|
100
|
+
walEnabled: true,
|
|
101
|
+
});
|
|
102
|
+
const carpool = new carpool_service_1.CarpoolService(graph);
|
|
103
|
+
// ============================================================================
|
|
104
|
+
// Test 1: Person Setup
|
|
105
|
+
// ============================================================================
|
|
106
|
+
section('1. 创建测试人员');
|
|
107
|
+
const zhangsan = graph.addPerson({
|
|
108
|
+
name: '张三',
|
|
109
|
+
properties: { gender: 'female', driver_license: true },
|
|
110
|
+
});
|
|
111
|
+
assert(!!zhangsan.id, '创建司机张三');
|
|
112
|
+
const lisi = graph.addPerson({
|
|
113
|
+
name: '李四',
|
|
114
|
+
properties: { gender: 'male', driver_license: true },
|
|
115
|
+
});
|
|
116
|
+
assert(!!lisi.id, '创建乘客李四');
|
|
117
|
+
const wangwu = graph.addPerson({
|
|
118
|
+
name: '王五',
|
|
119
|
+
properties: { gender: 'male' },
|
|
120
|
+
});
|
|
121
|
+
assert(!!wangwu.id, '创建乘客王五');
|
|
122
|
+
const zhaoliu = graph.addPerson({
|
|
123
|
+
name: '赵六',
|
|
124
|
+
properties: { gender: 'female' },
|
|
125
|
+
});
|
|
126
|
+
assert(!!zhaoliu.id, '创建乘客赵六');
|
|
127
|
+
// 建立社交关系
|
|
128
|
+
graph.addFriend(zhangsan.id, wangwu.id, {});
|
|
129
|
+
graph.addFriend(lisi.id, wangwu.id, {});
|
|
130
|
+
assert(true, '张三 ↔ 王五 好友关系');
|
|
131
|
+
assert(true, '李四 ↔ 王五 好友关系(张三和李四有共同好友王五)');
|
|
132
|
+
// ============================================================================
|
|
133
|
+
// Test 2: Publish Trip (T17.1)
|
|
134
|
+
// ============================================================================
|
|
135
|
+
section('2. 发布行程');
|
|
136
|
+
const tomorrow = new Date();
|
|
137
|
+
tomorrow.setDate(tomorrow.getDate() + 1);
|
|
138
|
+
const tomorrowStr = tomorrow.toISOString().slice(0, 10);
|
|
139
|
+
const tripDetail = carpool.publishTrip(zhangsan.id, {
|
|
140
|
+
trip_type: 'offer',
|
|
141
|
+
departure_date: tomorrowStr,
|
|
142
|
+
departure_time: 'morning',
|
|
143
|
+
origin: { province: '北京', city: '北京', district: '西城区' },
|
|
144
|
+
destination: { province: '河南', city: '漯河' },
|
|
145
|
+
max_passengers: 3,
|
|
146
|
+
gender_requirement: 'any',
|
|
147
|
+
price_type: 'paid',
|
|
148
|
+
price_per_person: 200,
|
|
149
|
+
vehicle_info: { brand: '保时捷', color: '白色', seats: 4 },
|
|
150
|
+
requirements: { no_smoking: true, can_drive: true, clean: true },
|
|
151
|
+
notes: '长期驾照,每年多次往返',
|
|
152
|
+
});
|
|
153
|
+
const tripId = tripDetail.trip.id;
|
|
154
|
+
assert(!!tripId, '发布行程成功');
|
|
155
|
+
assert(tripDetail.trip.properties.status === 'open', '行程状态为 open');
|
|
156
|
+
assert(tripDetail.trip.properties.current_passengers === 0, '当前乘客数为 0');
|
|
157
|
+
assert(tripDetail.trip.properties.max_passengers === 3, '最大乘客数为 3');
|
|
158
|
+
assert(tripDetail.trip.properties.trip_type === 'offer', '行程类型为 offer(车找人)');
|
|
159
|
+
assert(tripDetail.publisher.id === zhangsan.id, '发布者为张三');
|
|
160
|
+
assert(tripDetail.trip.properties.origin.city === '北京', '出发城市为北京');
|
|
161
|
+
assert(tripDetail.trip.properties.destination.city === '漯河', '目的城市为漯河');
|
|
162
|
+
// ============================================================================
|
|
163
|
+
// Test 3: Search Trips (T17.2)
|
|
164
|
+
// ============================================================================
|
|
165
|
+
section('3. 搜索行程');
|
|
166
|
+
const searchResults = carpool.searchTrips({
|
|
167
|
+
departure_date: tomorrowStr,
|
|
168
|
+
origin_city: '北京',
|
|
169
|
+
trip_type: 'offer',
|
|
170
|
+
});
|
|
171
|
+
assert(searchResults.length === 1, '按日期+城市+类型搜索到 1 个行程');
|
|
172
|
+
const emptyResults = carpool.searchTrips({
|
|
173
|
+
departure_date: tomorrowStr,
|
|
174
|
+
origin_city: '上海',
|
|
175
|
+
});
|
|
176
|
+
assert(emptyResults.length === 0, '搜索不存在的城市返回空');
|
|
177
|
+
const provinceResults = carpool.searchTrips({
|
|
178
|
+
destination_province: '河南',
|
|
179
|
+
});
|
|
180
|
+
assert(provinceResults.length === 1, '按目的省份搜索到 1 个行程');
|
|
181
|
+
// ============================================================================
|
|
182
|
+
// Test 4: Smart Matching (T18.5)
|
|
183
|
+
// ============================================================================
|
|
184
|
+
section('4. 智能匹配(社交信任排序)');
|
|
185
|
+
const matchResults = carpool.matchTrips(lisi.id, {
|
|
186
|
+
departure_date: tomorrowStr,
|
|
187
|
+
origin_city: '北京',
|
|
188
|
+
});
|
|
189
|
+
assert(matchResults.length === 1, '匹配到 1 个行程');
|
|
190
|
+
assert(matchResults[0].match_score > 0, `匹配分数 > 0 (实际: ${matchResults[0].match_score})`);
|
|
191
|
+
assert(matchResults[0].trust_score.level === 'semi_trusted', `信任等级为 semi_trusted(共同好友王五)`);
|
|
192
|
+
assert(matchResults[0].trust_score.mutual_friends_count === 1, '共同好友数为 1');
|
|
193
|
+
assert(matchResults[0].available_seats === 3, '可用座位为 3');
|
|
194
|
+
// 陌生人匹配
|
|
195
|
+
const strangerMatch = carpool.matchTrips(zhaoliu.id, {
|
|
196
|
+
departure_date: tomorrowStr,
|
|
197
|
+
origin_city: '北京',
|
|
198
|
+
});
|
|
199
|
+
assert(strangerMatch.length === 1, '陌生人也能搜到行程');
|
|
200
|
+
assert(strangerMatch[0].trust_score.level === 'stranger', '陌生人信任等级为 stranger');
|
|
201
|
+
// ============================================================================
|
|
202
|
+
// Test 5: Apply to Trip (T17.3)
|
|
203
|
+
// ============================================================================
|
|
204
|
+
section('5. 申请加入行程');
|
|
205
|
+
const applyResult = carpool.applyToTrip(lisi.id, tripId, '你好,我也回漯河,可以轮换开车');
|
|
206
|
+
assert(applyResult.success === true, '李四申请成功');
|
|
207
|
+
assert(applyResult.status === 'pending', '申请状态为 pending');
|
|
208
|
+
// 不能重复申请
|
|
209
|
+
const dupApply = carpool.applyToTrip(lisi.id, tripId);
|
|
210
|
+
assert(dupApply.success === false, '重复申请被拒绝');
|
|
211
|
+
assert(dupApply.error === types_1.CarpoolErrorCode.ALREADY_APPLIED, '错误码为 ALREADY_APPLIED');
|
|
212
|
+
// 不能申请自己的行程
|
|
213
|
+
const selfApply = carpool.applyToTrip(zhangsan.id, tripId);
|
|
214
|
+
assert(selfApply.success === false, '不能申请自己的行程');
|
|
215
|
+
assert(selfApply.error === types_1.CarpoolErrorCode.SELF_APPLY, '错误码为 SELF_APPLY');
|
|
216
|
+
// 查看申请列表
|
|
217
|
+
const detail = carpool.getTrip(tripId);
|
|
218
|
+
assert(detail.pending_applications.length === 1, '有 1 个待处理申请');
|
|
219
|
+
assert(detail.pending_applications[0].applicant.id === lisi.id, '申请人为李四');
|
|
220
|
+
// ============================================================================
|
|
221
|
+
// Test 6: Handle Application (T17.3 + T17.5)
|
|
222
|
+
// ============================================================================
|
|
223
|
+
section('6. 处理申请(接受/拒绝)');
|
|
224
|
+
// 张三接受李四的申请
|
|
225
|
+
const accepted = carpool.handleApplication(zhangsan.id, tripId, lisi.id, true);
|
|
226
|
+
assert(accepted === true, '接受李四的申请');
|
|
227
|
+
// 验证座位更新
|
|
228
|
+
const afterAccept = carpool.getTrip(tripId);
|
|
229
|
+
assert(afterAccept.trip.properties.current_passengers === 1, '当前乘客数更新为 1');
|
|
230
|
+
assert(afterAccept.trip.properties.status === 'open', '行程仍为 open(还有 2 个空位)');
|
|
231
|
+
assert(afterAccept.confirmed_passengers.length === 1, '已确认乘客 1 人');
|
|
232
|
+
assert(afterAccept.confirmed_passengers[0].id === lisi.id, '已确认乘客为李四');
|
|
233
|
+
assert(afterAccept.pending_applications.length === 0, '待处理申请清空');
|
|
234
|
+
// 王五申请并被接受
|
|
235
|
+
const wangwuApply = carpool.applyToTrip(wangwu.id, tripId);
|
|
236
|
+
assert(wangwuApply.success === true, '王五申请成功');
|
|
237
|
+
carpool.handleApplication(zhangsan.id, tripId, wangwu.id, true);
|
|
238
|
+
// 赵六申请并被接受 → 行程应变为 full
|
|
239
|
+
const zhaoliuApply = carpool.applyToTrip(zhaoliu.id, tripId);
|
|
240
|
+
assert(zhaoliuApply.success === true, '赵六申请成功');
|
|
241
|
+
carpool.handleApplication(zhangsan.id, tripId, zhaoliu.id, true);
|
|
242
|
+
const fullTrip = carpool.getTrip(tripId);
|
|
243
|
+
assert(fullTrip.trip.properties.current_passengers === 3, '当前乘客数为 3');
|
|
244
|
+
assert(fullTrip.trip.properties.status === 'full', '行程状态自动变为 full');
|
|
245
|
+
// ============================================================================
|
|
246
|
+
// Test 7: Leave Trip (T17.5)
|
|
247
|
+
// ============================================================================
|
|
248
|
+
section('7. 乘客退出');
|
|
249
|
+
const left = carpool.leaveTrip(tripId, zhaoliu.id);
|
|
250
|
+
assert(left === true, '赵六退出行程');
|
|
251
|
+
const afterLeave = carpool.getTrip(tripId);
|
|
252
|
+
assert(afterLeave.trip.properties.current_passengers === 2, '乘客数减为 2');
|
|
253
|
+
assert(afterLeave.trip.properties.status === 'open', '行程状态恢复为 open');
|
|
254
|
+
// ============================================================================
|
|
255
|
+
// Test 8: Complete & Rate Trip (T17.4 + T17.6)
|
|
256
|
+
// ============================================================================
|
|
257
|
+
section('8. 完成行程与评价');
|
|
258
|
+
// 非发布者不能完成
|
|
259
|
+
assertThrows(() => carpool.completeTrip(tripId, lisi.id), types_1.CarpoolErrorCode.NOT_PUBLISHER, '非发布者无法完成行程');
|
|
260
|
+
const completed = carpool.completeTrip(tripId, zhangsan.id);
|
|
261
|
+
assert(completed === true, '张三完成行程');
|
|
262
|
+
const completedTrip = carpool.getTrip(tripId);
|
|
263
|
+
assert(completedTrip.trip.properties.status === 'completed', '行程状态为 completed');
|
|
264
|
+
// 评价
|
|
265
|
+
const rated1 = carpool.rateTrip(lisi.id, tripId, 5.0, '车很干净舒适!');
|
|
266
|
+
assert(rated1 === true, '李四评价 5 分');
|
|
267
|
+
const rated2 = carpool.rateTrip(wangwu.id, tripId, 4.5, '司机人很好');
|
|
268
|
+
assert(rated2 === true, '王五评价 4.5 分');
|
|
269
|
+
// 获取评分
|
|
270
|
+
const avgRating = carpool.getPersonAverageRating(zhangsan.id);
|
|
271
|
+
assert(Math.abs(avgRating - 4.75) < 0.01, `张三平均评分为 4.75 (实际: ${avgRating})`);
|
|
272
|
+
// ============================================================================
|
|
273
|
+
// Test 9: Cancel Trip (T17.4)
|
|
274
|
+
// ============================================================================
|
|
275
|
+
section('9. 取消行程');
|
|
276
|
+
const trip2 = carpool.publishTrip(zhangsan.id, {
|
|
277
|
+
trip_type: 'offer',
|
|
278
|
+
departure_date: tomorrowStr,
|
|
279
|
+
origin: { province: '北京', city: '北京' },
|
|
280
|
+
destination: { province: '河南', city: '郑州' },
|
|
281
|
+
max_passengers: 2,
|
|
282
|
+
});
|
|
283
|
+
const cancelled = carpool.cancelTrip(trip2.trip.id, zhangsan.id);
|
|
284
|
+
assert(cancelled === true, '取消行程成功');
|
|
285
|
+
const cancelledTrip = carpool.getTrip(trip2.trip.id);
|
|
286
|
+
assert(cancelledTrip.trip.properties.status === 'cancelled', '行程状态为 cancelled');
|
|
287
|
+
// 不能申请已取消的行程
|
|
288
|
+
const applyCancel = carpool.applyToTrip(lisi.id, trip2.trip.id);
|
|
289
|
+
assert(applyCancel.success === false, '不能申请已取消的行程');
|
|
290
|
+
assert(applyCancel.error === types_1.CarpoolErrorCode.TRIP_CANCELLED, '错误码为 TRIP_CANCELLED');
|
|
291
|
+
// ============================================================================
|
|
292
|
+
// Test 10: Ride Request Mode (人找车)
|
|
293
|
+
// ============================================================================
|
|
294
|
+
section('10. 人找车模式');
|
|
295
|
+
const request = carpool.publishTrip(lisi.id, {
|
|
296
|
+
trip_type: 'request',
|
|
297
|
+
departure_date: tomorrowStr,
|
|
298
|
+
origin: { province: '北京', city: '北京' },
|
|
299
|
+
destination: { province: '河南', city: '漯河' },
|
|
300
|
+
max_passengers: 1,
|
|
301
|
+
price_type: 'share_cost',
|
|
302
|
+
notes: '一人,有驾照',
|
|
303
|
+
});
|
|
304
|
+
assert(request.trip.properties.trip_type === 'request', '行程类型为 request(人找车)');
|
|
305
|
+
// 司机搜索乘客需求
|
|
306
|
+
const passengerRequests = carpool.searchTrips({
|
|
307
|
+
trip_type: 'request',
|
|
308
|
+
destination_city: '漯河',
|
|
309
|
+
});
|
|
310
|
+
assert(passengerRequests.length === 1, '搜索到 1 个人找车需求');
|
|
311
|
+
// ============================================================================
|
|
312
|
+
// Test 11: Expired Trip Cleanup (T17.4)
|
|
313
|
+
// ============================================================================
|
|
314
|
+
section('11. 过期行程清理');
|
|
315
|
+
// 发布一个"过去"的行程(通过 repo 直接操作绕过日期校验)
|
|
316
|
+
const pastTrip = carpool.repo.createTrip(zhangsan.id, {
|
|
317
|
+
trip_type: 'offer',
|
|
318
|
+
departure_date: '2025-01-01', // 过去的日期
|
|
319
|
+
origin: { province: '北京', city: '北京' },
|
|
320
|
+
destination: { province: '河南', city: '漯河' },
|
|
321
|
+
max_passengers: 2,
|
|
322
|
+
});
|
|
323
|
+
const cleaned = carpool.cleanupExpiredTrips();
|
|
324
|
+
assert(cleaned >= 1, `清理了 ${cleaned} 个过期行程`);
|
|
325
|
+
const expiredTrip = carpool.repo.getTrip(pastTrip.id);
|
|
326
|
+
assert(expiredTrip.properties.status === 'expired', '过期行程状态为 expired');
|
|
327
|
+
// ============================================================================
|
|
328
|
+
// Test 12: Validators
|
|
329
|
+
// ============================================================================
|
|
330
|
+
section('12. 输入校验');
|
|
331
|
+
assertThrows(() => carpool.publishTrip(zhangsan.id, {
|
|
332
|
+
trip_type: 'offer',
|
|
333
|
+
departure_date: '2020-01-01',
|
|
334
|
+
origin: { province: '北京', city: '北京' },
|
|
335
|
+
destination: { province: '河南', city: '漯河' },
|
|
336
|
+
max_passengers: 3,
|
|
337
|
+
}), types_1.CarpoolErrorCode.INVALID_DATE, '过期日期被拒绝');
|
|
338
|
+
assertThrows(() => carpool.publishTrip(zhangsan.id, {
|
|
339
|
+
trip_type: 'offer',
|
|
340
|
+
departure_date: tomorrowStr,
|
|
341
|
+
origin: { province: '', city: '' },
|
|
342
|
+
destination: { province: '河南', city: '漯河' },
|
|
343
|
+
max_passengers: 3,
|
|
344
|
+
}), types_1.CarpoolErrorCode.INVALID_LOCATION, '空出发地被拒绝');
|
|
345
|
+
assertThrows(() => carpool.publishTrip(zhangsan.id, {
|
|
346
|
+
trip_type: 'offer',
|
|
347
|
+
departure_date: tomorrowStr,
|
|
348
|
+
origin: { province: '北京', city: '北京' },
|
|
349
|
+
destination: { province: '河南', city: '漯河' },
|
|
350
|
+
max_passengers: 0,
|
|
351
|
+
}), types_1.CarpoolErrorCode.INVALID_PASSENGERS, '乘客数 0 被拒绝');
|
|
352
|
+
assertThrows(() => carpool.publishTrip(zhangsan.id, {
|
|
353
|
+
trip_type: 'offer',
|
|
354
|
+
departure_date: tomorrowStr,
|
|
355
|
+
origin: { province: '北京', city: '北京' },
|
|
356
|
+
destination: { province: '河南', city: '漯河' },
|
|
357
|
+
max_passengers: 10,
|
|
358
|
+
}), types_1.CarpoolErrorCode.INVALID_PASSENGERS, '乘客数 10 被拒绝(最大 7)');
|
|
359
|
+
// ============================================================================
|
|
360
|
+
// Test 13: Person Trips Query
|
|
361
|
+
// ============================================================================
|
|
362
|
+
section('13. 个人行程查询');
|
|
363
|
+
const zhangsanTrips = carpool.getPersonTrips(zhangsan.id);
|
|
364
|
+
assert(zhangsanTrips.length >= 2, `张三发布了 ${zhangsanTrips.length} 个行程`);
|
|
365
|
+
const lisiJoined = carpool.repo.getPersonJoinedTrips(lisi.id);
|
|
366
|
+
assert(lisiJoined.length === 1, `李四已加入 ${lisiJoined.length} 个行程`);
|
|
367
|
+
// ============================================================================
|
|
368
|
+
// Summary
|
|
369
|
+
// ============================================================================
|
|
370
|
+
console.log('\n' + '═'.repeat(50));
|
|
371
|
+
console.log(`测试完成: ${passed} 通过, ${failed} 失败`);
|
|
372
|
+
if (failures.length > 0) {
|
|
373
|
+
console.log('\n失败项:');
|
|
374
|
+
for (const f of failures) {
|
|
375
|
+
console.log(` ❌ ${f}`);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
// Cleanup
|
|
379
|
+
try {
|
|
380
|
+
fs.rmSync(testDir, { recursive: true, force: true });
|
|
381
|
+
console.log(`\n测试目录已清理: ${testDir}`);
|
|
382
|
+
}
|
|
383
|
+
catch {
|
|
384
|
+
console.log(`\n请手动清理: ${testDir}`);
|
|
385
|
+
}
|
|
386
|
+
process.exit(failed > 0 ? 1 : 0);
|
|
387
|
+
//# sourceMappingURL=carpool-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carpool-test.js","sourceRoot":"","sources":["../../ts/carpool/carpool-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Carpool Module - 顺风车/拼车功能
|
|
3
|
+
*
|
|
4
|
+
* 基于 SocialGraphV2 构建的拼车功能模块。
|
|
5
|
+
* 支持车找人和人找车两种模式,利用社交图谱提供信任增强的拼车匹配。
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { SocialGraphV2 } from '../social-graph-v2';
|
|
10
|
+
* import { CarpoolService } from './carpool';
|
|
11
|
+
*
|
|
12
|
+
* const graph = new SocialGraphV2({ path: './data/social' });
|
|
13
|
+
* const carpool = new CarpoolService(graph);
|
|
14
|
+
*
|
|
15
|
+
* // 发布行程
|
|
16
|
+
* const trip = carpool.publishTrip(driverId, {
|
|
17
|
+
* trip_type: 'offer',
|
|
18
|
+
* departure_date: '2026-02-12',
|
|
19
|
+
* origin: { province: '北京', city: '北京', district: '西城区' },
|
|
20
|
+
* destination: { province: '河南', city: '漯河' },
|
|
21
|
+
* max_passengers: 3,
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* // 智能匹配(含社交信任排序)
|
|
25
|
+
* const results = carpool.matchTrips(passengerId, {
|
|
26
|
+
* departure_date: '2026-02-12',
|
|
27
|
+
* origin_city: '北京',
|
|
28
|
+
* destination_province: '河南',
|
|
29
|
+
* });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export { CarpoolService } from './carpool-service';
|
|
33
|
+
export { CarpoolRepository } from './carpool-repo';
|
|
34
|
+
export { CarpoolMatcher, type MatchWeights } from './carpool-matcher';
|
|
35
|
+
export { TrustEvaluator } from './trust-evaluator';
|
|
36
|
+
export { TripIndex } from './trip-index';
|
|
37
|
+
export { TripScheduler, type SchedulerConfig, type CleanupResult } from './trip-scheduler';
|
|
38
|
+
export { PrivacyGuard, type PrivacyConfig, type VisibilityLevel } from './privacy-guard';
|
|
39
|
+
export { ReportSystem, type Report, type ReportReason, type CreditScore, } from './report-system';
|
|
40
|
+
export { validateCreateTripInput, validateApplyTripInput, validateRating, validateDate, validateDateNotExpired, validateLocation, validateLicensePlate, validateRegisterVehicleInput, validateUpdateVehicleInput, } from './validators';
|
|
41
|
+
export { type TripType, type TripStatus, type GenderRequirement, type PriceType, type ApplicationStatus, type ContactType, type TrustLevel, type DepartureTimePeriod, type Location, type VehicleInfo, type TripRequirements, type TripProperties, type CarpoolTrip, type VehicleStatus, type FuelType, type VehicleProperties, type CarpoolVehicle, type RegisterVehicleInput, type UpdateVehicleInput, type VehicleDetail, type CreateTripInput, type UpdateTripInput, type ApplyTripInput, type SearchTripsFilter, type TrustScore, type MatchResult, type TripDetail, type TripApplication, type ApplicationResult, CarpoolErrorCode, CarpoolError, ENTITY_TYPE_CARPOOL_TRIP, ENTITY_TYPE_VEHICLE, RELATION_TYPES, } from './types';
|
|
42
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ts/carpool/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnD,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAE,aAAa,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG3F,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGzF,OAAO,EACL,YAAY,EACZ,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,cAAc,EACd,YAAY,EACZ,sBAAsB,EACtB,gBAAgB,EAEhB,oBAAoB,EACpB,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AAGtB,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,mBAAmB,EAGxB,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,WAAW,EAGhB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAGlB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,cAAc,EAGnB,KAAK,iBAAiB,EAGtB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAGtB,gBAAgB,EAChB,YAAY,EAGZ,wBAAwB,EACxB,mBAAmB,EACnB,cAAc,GACf,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Carpool Module - 顺风车/拼车功能
|
|
4
|
+
*
|
|
5
|
+
* 基于 SocialGraphV2 构建的拼车功能模块。
|
|
6
|
+
* 支持车找人和人找车两种模式,利用社交图谱提供信任增强的拼车匹配。
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { SocialGraphV2 } from '../social-graph-v2';
|
|
11
|
+
* import { CarpoolService } from './carpool';
|
|
12
|
+
*
|
|
13
|
+
* const graph = new SocialGraphV2({ path: './data/social' });
|
|
14
|
+
* const carpool = new CarpoolService(graph);
|
|
15
|
+
*
|
|
16
|
+
* // 发布行程
|
|
17
|
+
* const trip = carpool.publishTrip(driverId, {
|
|
18
|
+
* trip_type: 'offer',
|
|
19
|
+
* departure_date: '2026-02-12',
|
|
20
|
+
* origin: { province: '北京', city: '北京', district: '西城区' },
|
|
21
|
+
* destination: { province: '河南', city: '漯河' },
|
|
22
|
+
* max_passengers: 3,
|
|
23
|
+
* });
|
|
24
|
+
*
|
|
25
|
+
* // 智能匹配(含社交信任排序)
|
|
26
|
+
* const results = carpool.matchTrips(passengerId, {
|
|
27
|
+
* departure_date: '2026-02-12',
|
|
28
|
+
* origin_city: '北京',
|
|
29
|
+
* destination_province: '河南',
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
+
exports.RELATION_TYPES = exports.ENTITY_TYPE_VEHICLE = exports.ENTITY_TYPE_CARPOOL_TRIP = exports.CarpoolError = exports.CarpoolErrorCode = exports.validateUpdateVehicleInput = exports.validateRegisterVehicleInput = exports.validateLicensePlate = exports.validateLocation = exports.validateDateNotExpired = exports.validateDate = exports.validateRating = exports.validateApplyTripInput = exports.validateCreateTripInput = exports.ReportSystem = exports.PrivacyGuard = exports.TripScheduler = exports.TripIndex = exports.TrustEvaluator = exports.CarpoolMatcher = exports.CarpoolRepository = exports.CarpoolService = void 0;
|
|
35
|
+
// Core Service
|
|
36
|
+
var carpool_service_1 = require("./carpool-service");
|
|
37
|
+
Object.defineProperty(exports, "CarpoolService", { enumerable: true, get: function () { return carpool_service_1.CarpoolService; } });
|
|
38
|
+
// Repository (for advanced use)
|
|
39
|
+
var carpool_repo_1 = require("./carpool-repo");
|
|
40
|
+
Object.defineProperty(exports, "CarpoolRepository", { enumerable: true, get: function () { return carpool_repo_1.CarpoolRepository; } });
|
|
41
|
+
// Matching Engine
|
|
42
|
+
var carpool_matcher_1 = require("./carpool-matcher");
|
|
43
|
+
Object.defineProperty(exports, "CarpoolMatcher", { enumerable: true, get: function () { return carpool_matcher_1.CarpoolMatcher; } });
|
|
44
|
+
// Trust Evaluator
|
|
45
|
+
var trust_evaluator_1 = require("./trust-evaluator");
|
|
46
|
+
Object.defineProperty(exports, "TrustEvaluator", { enumerable: true, get: function () { return trust_evaluator_1.TrustEvaluator; } });
|
|
47
|
+
// Index (T20.1)
|
|
48
|
+
var trip_index_1 = require("./trip-index");
|
|
49
|
+
Object.defineProperty(exports, "TripIndex", { enumerable: true, get: function () { return trip_index_1.TripIndex; } });
|
|
50
|
+
// Scheduler (T20.2)
|
|
51
|
+
var trip_scheduler_1 = require("./trip-scheduler");
|
|
52
|
+
Object.defineProperty(exports, "TripScheduler", { enumerable: true, get: function () { return trip_scheduler_1.TripScheduler; } });
|
|
53
|
+
// Privacy Guard (T20.3)
|
|
54
|
+
var privacy_guard_1 = require("./privacy-guard");
|
|
55
|
+
Object.defineProperty(exports, "PrivacyGuard", { enumerable: true, get: function () { return privacy_guard_1.PrivacyGuard; } });
|
|
56
|
+
// Report System (T20.4)
|
|
57
|
+
var report_system_1 = require("./report-system");
|
|
58
|
+
Object.defineProperty(exports, "ReportSystem", { enumerable: true, get: function () { return report_system_1.ReportSystem; } });
|
|
59
|
+
// Validators
|
|
60
|
+
var validators_1 = require("./validators");
|
|
61
|
+
Object.defineProperty(exports, "validateCreateTripInput", { enumerable: true, get: function () { return validators_1.validateCreateTripInput; } });
|
|
62
|
+
Object.defineProperty(exports, "validateApplyTripInput", { enumerable: true, get: function () { return validators_1.validateApplyTripInput; } });
|
|
63
|
+
Object.defineProperty(exports, "validateRating", { enumerable: true, get: function () { return validators_1.validateRating; } });
|
|
64
|
+
Object.defineProperty(exports, "validateDate", { enumerable: true, get: function () { return validators_1.validateDate; } });
|
|
65
|
+
Object.defineProperty(exports, "validateDateNotExpired", { enumerable: true, get: function () { return validators_1.validateDateNotExpired; } });
|
|
66
|
+
Object.defineProperty(exports, "validateLocation", { enumerable: true, get: function () { return validators_1.validateLocation; } });
|
|
67
|
+
// Vehicle validators (V2 - T21.7)
|
|
68
|
+
Object.defineProperty(exports, "validateLicensePlate", { enumerable: true, get: function () { return validators_1.validateLicensePlate; } });
|
|
69
|
+
Object.defineProperty(exports, "validateRegisterVehicleInput", { enumerable: true, get: function () { return validators_1.validateRegisterVehicleInput; } });
|
|
70
|
+
Object.defineProperty(exports, "validateUpdateVehicleInput", { enumerable: true, get: function () { return validators_1.validateUpdateVehicleInput; } });
|
|
71
|
+
// Types
|
|
72
|
+
var types_1 = require("./types");
|
|
73
|
+
// Error Types
|
|
74
|
+
Object.defineProperty(exports, "CarpoolErrorCode", { enumerable: true, get: function () { return types_1.CarpoolErrorCode; } });
|
|
75
|
+
Object.defineProperty(exports, "CarpoolError", { enumerable: true, get: function () { return types_1.CarpoolError; } });
|
|
76
|
+
// Constants
|
|
77
|
+
Object.defineProperty(exports, "ENTITY_TYPE_CARPOOL_TRIP", { enumerable: true, get: function () { return types_1.ENTITY_TYPE_CARPOOL_TRIP; } });
|
|
78
|
+
Object.defineProperty(exports, "ENTITY_TYPE_VEHICLE", { enumerable: true, get: function () { return types_1.ENTITY_TYPE_VEHICLE; } });
|
|
79
|
+
Object.defineProperty(exports, "RELATION_TYPES", { enumerable: true, get: function () { return types_1.RELATION_TYPES; } });
|
|
80
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/carpool/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;;;AAEH,eAAe;AACf,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AAEvB,gCAAgC;AAChC,+CAAmD;AAA1C,iHAAA,iBAAiB,OAAA;AAE1B,kBAAkB;AAClB,qDAAsE;AAA7D,iHAAA,cAAc,OAAA;AAEvB,kBAAkB;AAClB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AAEvB,gBAAgB;AAChB,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAElB,oBAAoB;AACpB,mDAA2F;AAAlF,+GAAA,aAAa,OAAA;AAEtB,wBAAwB;AACxB,iDAAyF;AAAhF,6GAAA,YAAY,OAAA;AAErB,wBAAwB;AACxB,iDAKyB;AAJvB,6GAAA,YAAY,OAAA;AAMd,aAAa;AACb,2CAWsB;AAVpB,qHAAA,uBAAuB,OAAA;AACvB,oHAAA,sBAAsB,OAAA;AACtB,4GAAA,cAAc,OAAA;AACd,0GAAA,YAAY,OAAA;AACZ,oHAAA,sBAAsB,OAAA;AACtB,8GAAA,gBAAgB,OAAA;AAChB,kCAAkC;AAClC,kHAAA,oBAAoB,OAAA;AACpB,0HAAA,4BAA4B,OAAA;AAC5B,wHAAA,0BAA0B,OAAA;AAG5B,QAAQ;AACR,iCAkDiB;AARf,cAAc;AACd,yGAAA,gBAAgB,OAAA;AAChB,qGAAA,YAAY,OAAA;AAEZ,YAAY;AACZ,iHAAA,wBAAwB,OAAA;AACxB,4GAAA,mBAAmB,OAAA;AACnB,uGAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Privacy Guard - Contact Encryption & Trip Visibility Control (T20.3)
|
|
3
|
+
*
|
|
4
|
+
* 隐私安全加固:
|
|
5
|
+
* - 联系方式脱敏/加密
|
|
6
|
+
* - 行程可见性控制(仅好友可见、仅认证用户可见等)
|
|
7
|
+
* - 个人信息保护
|
|
8
|
+
*/
|
|
9
|
+
import type { SocialGraphV2 } from '../social-graph-v2';
|
|
10
|
+
import type { CarpoolTrip, TripDetail } from './types';
|
|
11
|
+
/** 可见性级别 */
|
|
12
|
+
export type VisibilityLevel = 'public' | 'friends_only' | 'verified_only' | 'private';
|
|
13
|
+
/** 隐私配置 */
|
|
14
|
+
export interface PrivacyConfig {
|
|
15
|
+
/** 默认行程可见性 */
|
|
16
|
+
defaultVisibility: VisibilityLevel;
|
|
17
|
+
/** 联系方式仅对已确认乘客/发布者可见 */
|
|
18
|
+
contactOnlyForConfirmed: boolean;
|
|
19
|
+
/** 是否对非关联方脱敏联系方式 */
|
|
20
|
+
maskContactForStrangers: boolean;
|
|
21
|
+
/** 对搜索结果隐藏的字段列表 */
|
|
22
|
+
hiddenFieldsInSearch: string[];
|
|
23
|
+
}
|
|
24
|
+
export declare class PrivacyGuard {
|
|
25
|
+
private graph;
|
|
26
|
+
private config;
|
|
27
|
+
constructor(graph: SocialGraphV2, config?: Partial<PrivacyConfig>);
|
|
28
|
+
/**
|
|
29
|
+
* 对手机号脱敏:保留前3位和后4位
|
|
30
|
+
* 例如: 13812345678 → 138****5678
|
|
31
|
+
*/
|
|
32
|
+
maskPhone(phone: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* 对微信号脱敏:保留前2位和后2位
|
|
35
|
+
* 例如: wxid_abc123xyz → wx*********yz
|
|
36
|
+
*/
|
|
37
|
+
maskWechat(wechat: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* 通用联系方式脱敏
|
|
40
|
+
*/
|
|
41
|
+
maskContact(contactType: string | undefined, contactValue: string | undefined): string | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* 简单加密联系方式(XOR + Base64)
|
|
44
|
+
* 注意:这只是演示级别加密,生产环境应使用 AES-256-GCM
|
|
45
|
+
*/
|
|
46
|
+
encrypt(plaintext: string, key: string): string;
|
|
47
|
+
/**
|
|
48
|
+
* 解密联系方式
|
|
49
|
+
*/
|
|
50
|
+
decrypt(ciphertext: string, key: string): string;
|
|
51
|
+
/**
|
|
52
|
+
* 检查用户是否有权查看行程
|
|
53
|
+
*/
|
|
54
|
+
canViewTrip(trip: CarpoolTrip, viewerId: string | undefined, publisherId: string, visibility?: VisibilityLevel): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* 对行程详情应用隐私保护(脱敏/隐藏联系方式)
|
|
57
|
+
*/
|
|
58
|
+
applyPrivacy(detail: TripDetail, viewerId: string | undefined): TripDetail;
|
|
59
|
+
/**
|
|
60
|
+
* 对搜索结果列表批量脱敏
|
|
61
|
+
*/
|
|
62
|
+
sanitizeSearchResults(trips: CarpoolTrip[]): CarpoolTrip[];
|
|
63
|
+
private areFriendsOrConnected;
|
|
64
|
+
private stringToBytes;
|
|
65
|
+
private bytesToString;
|
|
66
|
+
private bytesToBase64;
|
|
67
|
+
private base64ToBytes;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=privacy-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy-guard.d.ts","sourceRoot":"","sources":["../../ts/carpool/privacy-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAMvD,YAAY;AACZ,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,cAAc,GAAG,eAAe,GAAG,SAAS,CAAC;AAEtF,WAAW;AACX,MAAM,WAAW,aAAa;IAC5B,cAAc;IACd,iBAAiB,EAAE,eAAe,CAAC;IACnC,wBAAwB;IACxB,uBAAuB,EAAE,OAAO,CAAC;IACjC,oBAAoB;IACpB,uBAAuB,EAAE,OAAO,CAAC;IACjC,mBAAmB;IACnB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAaD,qBAAa,YAAY;IAIrB,OAAO,CAAC,KAAK;IAHf,OAAO,CAAC,MAAM,CAAgB;gBAGpB,KAAK,EAAE,aAAa,EAC5B,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IASjC;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAOhC;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAQlC;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS;IAYlG;;;OAGG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAY/C;;OAEG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAgBhD;;OAEG;IACH,WAAW,CACT,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,WAAW,EAAE,MAAM,EACnB,UAAU,GAAE,eAA+C,GAC1D,OAAO;IAyBV;;OAEG;IACH,YAAY,CACV,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,UAAU;IAgCb;;OAEG;IACH,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IAqB1D,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,aAAa;CAQtB"}
|