opensoma 0.6.0 → 0.8.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/package.json +1 -1
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +6 -4
- package/dist/src/cli.js.map +1 -1
- package/dist/src/client.d.ts +4 -0
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/client.js +6 -0
- package/dist/src/client.js.map +1 -1
- package/dist/src/commands/index.d.ts +1 -0
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +1 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/toz.d.ts +16 -0
- package/dist/src/commands/toz.d.ts.map +1 -0
- package/dist/src/commands/toz.js +488 -0
- package/dist/src/commands/toz.js.map +1 -0
- package/dist/src/credential-manager.d.ts +8 -2
- package/dist/src/credential-manager.d.ts.map +1 -1
- package/dist/src/credential-manager.js +27 -5
- package/dist/src/credential-manager.js.map +1 -1
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/session-recovery.js +2 -0
- package/dist/src/session-recovery.js.map +1 -1
- package/dist/src/shared/utils/config-dir.d.ts +11 -0
- package/dist/src/shared/utils/config-dir.d.ts.map +1 -0
- package/dist/src/shared/utils/config-dir.js +19 -0
- package/dist/src/shared/utils/config-dir.js.map +1 -0
- package/dist/src/toz-client.d.ts +89 -0
- package/dist/src/toz-client.d.ts.map +1 -0
- package/dist/src/toz-client.js +204 -0
- package/dist/src/toz-client.js.map +1 -0
- package/dist/src/toz-pending-store.d.ts +30 -0
- package/dist/src/toz-pending-store.d.ts.map +1 -0
- package/dist/src/toz-pending-store.js +36 -0
- package/dist/src/toz-pending-store.js.map +1 -0
- package/package.json +1 -1
- package/src/cli.ts +6 -3
- package/src/client.ts +10 -0
- package/src/commands/helpers.test.ts +4 -0
- package/src/commands/index.ts +1 -0
- package/src/commands/toz.test.ts +51 -0
- package/src/commands/toz.ts +607 -0
- package/src/credential-manager.test.ts +54 -0
- package/src/credential-manager.ts +28 -5
- package/src/index.ts +13 -0
- package/src/session-recovery.ts +2 -0
- package/src/shared/utils/config-dir.test.ts +41 -0
- package/src/shared/utils/config-dir.ts +20 -0
- package/src/toz-client.test.ts +243 -0
- package/src/toz-client.ts +311 -0
- package/src/toz-pending-store.test.ts +91 -0
- package/src/toz-pending-store.ts +63 -0
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import { stdin as input, stdout as output } from 'node:process';
|
|
2
|
+
import { createInterface } from 'node:readline/promises';
|
|
3
|
+
import { Command } from 'commander';
|
|
4
|
+
import { TOZ_BRANCHES } from '../constants.js';
|
|
5
|
+
import { CredentialManager } from '../credential-manager.js';
|
|
6
|
+
import { handleError } from '../shared/utils/error-handler.js';
|
|
7
|
+
import { formatOutput } from '../shared/utils/output.js';
|
|
8
|
+
import * as stderr from '../shared/utils/stderr.js';
|
|
9
|
+
import { formatPhone, parsePhone } from '../shared/utils/toz.js';
|
|
10
|
+
import { TozClient } from '../toz-client.js';
|
|
11
|
+
import { TozPendingStore } from '../toz-pending-store.js';
|
|
12
|
+
function parseStrictPositiveInt(value, flag) {
|
|
13
|
+
if (!/^\d+$/.test(value))
|
|
14
|
+
throw new Error(`Invalid --${flag}: ${value} (expected positive integer)`);
|
|
15
|
+
const n = Number.parseInt(value, 10);
|
|
16
|
+
if (!Number.isSafeInteger(n) || n <= 0)
|
|
17
|
+
throw new Error(`Invalid --${flag}: ${value} (expected positive integer)`);
|
|
18
|
+
return n;
|
|
19
|
+
}
|
|
20
|
+
function parseDurationFlag(value) {
|
|
21
|
+
const match = /^(\d+)\s*([hm])?$/i.exec(value.trim());
|
|
22
|
+
if (!match)
|
|
23
|
+
throw new Error(`Invalid --duration: ${value} (use e.g. "2h", "120", "150m")`);
|
|
24
|
+
const n = Number.parseInt(match[1], 10);
|
|
25
|
+
const unit = (match[2] ?? 'm').toLowerCase();
|
|
26
|
+
return unit === 'h' ? n * 60 : n;
|
|
27
|
+
}
|
|
28
|
+
function parseUserCount(value) {
|
|
29
|
+
const n = Number.parseInt(value, 10);
|
|
30
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
31
|
+
throw new Error(`Invalid --user-count: ${value}`);
|
|
32
|
+
return n;
|
|
33
|
+
}
|
|
34
|
+
function resolveBranchIds(values) {
|
|
35
|
+
if (!values || values.length === 0)
|
|
36
|
+
return TOZ_BRANCHES.map((b) => b.id);
|
|
37
|
+
const ids = [];
|
|
38
|
+
for (const value of values) {
|
|
39
|
+
const numeric = Number.parseInt(value, 10);
|
|
40
|
+
if (Number.isFinite(numeric)) {
|
|
41
|
+
ids.push(numeric);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const matched = TOZ_BRANCHES.find((b) => b.name === value || b.name.includes(value));
|
|
45
|
+
if (!matched)
|
|
46
|
+
throw new Error(`Unknown branch: ${value}`);
|
|
47
|
+
ids.push(matched.id);
|
|
48
|
+
}
|
|
49
|
+
return ids;
|
|
50
|
+
}
|
|
51
|
+
export async function resolveTozIdentity(flagName, flagPhone, options = {}) {
|
|
52
|
+
if (flagName && flagPhone)
|
|
53
|
+
return { name: flagName, phone: flagPhone };
|
|
54
|
+
const store = options.store ?? new CredentialManager();
|
|
55
|
+
const stored = await store.getTozIdentity();
|
|
56
|
+
const name = flagName ?? stored?.name;
|
|
57
|
+
let phone = flagPhone ?? stored?.phone;
|
|
58
|
+
if (!name) {
|
|
59
|
+
throw new Error('Toz identity not set. Run: opensoma toz login --name <name> --phone <phone>');
|
|
60
|
+
}
|
|
61
|
+
if (!phone) {
|
|
62
|
+
if (!options.promptPhone) {
|
|
63
|
+
throw new Error('Toz identity not set. Run: opensoma toz login --name <name> --phone <phone>');
|
|
64
|
+
}
|
|
65
|
+
phone = await options.promptPhone();
|
|
66
|
+
}
|
|
67
|
+
return { name, phone };
|
|
68
|
+
}
|
|
69
|
+
export async function resolveTozPin(pin, promptPin) {
|
|
70
|
+
return pin ?? (await promptPin());
|
|
71
|
+
}
|
|
72
|
+
async function loginAction(options) {
|
|
73
|
+
try {
|
|
74
|
+
const manager = new CredentialManager();
|
|
75
|
+
await manager.setTozIdentity(options.name, options.phone);
|
|
76
|
+
console.log(formatOutput({ ok: true, message: `Toz identity saved for ${options.name} (${maskPhone(options.phone)})` }, options.pretty));
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
handleError(error);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async function logoutAction(options) {
|
|
83
|
+
try {
|
|
84
|
+
await new CredentialManager().clearTozIdentity();
|
|
85
|
+
await new TozPendingStore().clear();
|
|
86
|
+
console.log(formatOutput({ ok: true }, options.pretty));
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
handleError(error);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function statusAction(options) {
|
|
93
|
+
try {
|
|
94
|
+
const stored = await new CredentialManager().getTozIdentity();
|
|
95
|
+
if (!stored) {
|
|
96
|
+
console.log(formatOutput({ loggedIn: false }, options.pretty));
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
console.log(formatOutput({ loggedIn: true, name: stored.name, phone: maskPhone(stored.phone) }, options.pretty));
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
handleError(error);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function branchesAction(options) {
|
|
106
|
+
try {
|
|
107
|
+
const branches = await new TozClient().branches();
|
|
108
|
+
console.log(formatOutput(branches, options.pretty));
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
handleError(error);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function meetingsAction(options) {
|
|
115
|
+
try {
|
|
116
|
+
const meetings = await new TozClient().meetings();
|
|
117
|
+
console.log(formatOutput(meetings, options.pretty));
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
handleError(error);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
async function availableAction(options) {
|
|
124
|
+
try {
|
|
125
|
+
const booths = await new TozClient().available({
|
|
126
|
+
date: options.date,
|
|
127
|
+
startTime: options.start,
|
|
128
|
+
durationMinutes: parseDurationFlag(options.duration),
|
|
129
|
+
userCount: parseUserCount(options.userCount),
|
|
130
|
+
branchIds: resolveBranchIds(options.branch),
|
|
131
|
+
});
|
|
132
|
+
console.log(formatOutput(booths, options.pretty));
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
handleError(error);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async function checkAction(options) {
|
|
139
|
+
try {
|
|
140
|
+
const startedAt = Date.now();
|
|
141
|
+
const checked = await new TozClient().check({
|
|
142
|
+
date: options.date,
|
|
143
|
+
startTimes: options.time,
|
|
144
|
+
durationMinutes: parseDurationFlag(options.duration),
|
|
145
|
+
userCount: parseUserCount(options.userCount),
|
|
146
|
+
branchIds: resolveBranchIds(options.branch),
|
|
147
|
+
});
|
|
148
|
+
console.log(formatOutput({
|
|
149
|
+
date: options.date,
|
|
150
|
+
durationMinutes: parseDurationFlag(options.duration),
|
|
151
|
+
userCount: parseUserCount(options.userCount),
|
|
152
|
+
checked,
|
|
153
|
+
requestsIssued: options.time.length,
|
|
154
|
+
wallTimeMs: Date.now() - startedAt,
|
|
155
|
+
}, options.pretty));
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
handleError(error);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
async function reserveRequestAction(options) {
|
|
162
|
+
try {
|
|
163
|
+
const identity = await resolveTozIdentity(options.name, options.phone, { promptPhone });
|
|
164
|
+
const durationMinutes = parseDurationFlag(options.duration);
|
|
165
|
+
const userCount = parseUserCount(options.userCount);
|
|
166
|
+
const boothId = parseStrictPositiveInt(options.boothId, 'booth-id');
|
|
167
|
+
const meetingId = options.meetingId ? parseStrictPositiveInt(options.meetingId, 'meeting-id') : undefined;
|
|
168
|
+
if (!meetingId && !options.newMeeting)
|
|
169
|
+
throw new Error('--meeting-id or --new-meeting is required');
|
|
170
|
+
const client = new TozClient();
|
|
171
|
+
const reserved = await client.reserveBooth({
|
|
172
|
+
date: options.date,
|
|
173
|
+
startTime: options.start,
|
|
174
|
+
durationMinutes,
|
|
175
|
+
userCount,
|
|
176
|
+
boothId,
|
|
177
|
+
});
|
|
178
|
+
await client.skipEquipment({
|
|
179
|
+
reservationId: reserved.reservationId,
|
|
180
|
+
date: options.date,
|
|
181
|
+
startTime: options.start,
|
|
182
|
+
durationMinutes,
|
|
183
|
+
});
|
|
184
|
+
await client.sendOtp(identity.phone);
|
|
185
|
+
const endTime = computeEndTime(options.start, durationMinutes);
|
|
186
|
+
const now = new Date();
|
|
187
|
+
const pending = {
|
|
188
|
+
reservationId: reserved.reservationId,
|
|
189
|
+
cookies: client.http.getCookies(),
|
|
190
|
+
branchName: reserved.branchName,
|
|
191
|
+
branchTel: reserved.branchTel,
|
|
192
|
+
boothGroupName: reserved.boothGroupName,
|
|
193
|
+
isLargeBooth: reserved.isLargeBooth,
|
|
194
|
+
date: options.date,
|
|
195
|
+
startTime: options.start,
|
|
196
|
+
endTime,
|
|
197
|
+
durationMinutes,
|
|
198
|
+
userCount,
|
|
199
|
+
boothId,
|
|
200
|
+
meetingId,
|
|
201
|
+
newMeetingName: options.newMeeting,
|
|
202
|
+
email: options.email,
|
|
203
|
+
memo: options.memo,
|
|
204
|
+
name: identity.name,
|
|
205
|
+
phone: identity.phone,
|
|
206
|
+
createdAt: now.toISOString(),
|
|
207
|
+
expiresAt: new Date(now.getTime() + 5 * 60 * 1000).toISOString(),
|
|
208
|
+
};
|
|
209
|
+
await new TozPendingStore().set(pending);
|
|
210
|
+
console.log(formatOutput({
|
|
211
|
+
ok: true,
|
|
212
|
+
reservationId: reserved.reservationId,
|
|
213
|
+
branchName: reserved.branchName,
|
|
214
|
+
boothGroupName: reserved.boothGroupName,
|
|
215
|
+
date: options.date,
|
|
216
|
+
startTime: options.start,
|
|
217
|
+
endTime,
|
|
218
|
+
expiresAt: pending.expiresAt,
|
|
219
|
+
message: `SMS sent to ${maskPhone(identity.phone)}. Run: opensoma toz reserve-confirm --pin <pin>`,
|
|
220
|
+
}, options.pretty));
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
handleError(error);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
async function reserveConfirmAction(options) {
|
|
227
|
+
try {
|
|
228
|
+
const store = new TozPendingStore();
|
|
229
|
+
const pending = await store.get();
|
|
230
|
+
if (!pending) {
|
|
231
|
+
throw new Error('No pending toz reservation. Run: opensoma toz reserve-request first.');
|
|
232
|
+
}
|
|
233
|
+
if (Date.now() > new Date(pending.expiresAt).getTime()) {
|
|
234
|
+
await store.clear();
|
|
235
|
+
throw new Error('Pending toz reservation expired (5-minute hold lapsed). Run: opensoma toz reserve-request again.');
|
|
236
|
+
}
|
|
237
|
+
const pin = await resolveTozPin(options.pin, promptPin);
|
|
238
|
+
const client = new TozClient({ cookies: pending.cookies });
|
|
239
|
+
const result = await client.confirm({
|
|
240
|
+
reservationId: pending.reservationId,
|
|
241
|
+
date: pending.date,
|
|
242
|
+
startTime: pending.startTime,
|
|
243
|
+
durationMinutes: pending.durationMinutes,
|
|
244
|
+
name: pending.name,
|
|
245
|
+
phone: pending.phone,
|
|
246
|
+
email: pending.email,
|
|
247
|
+
pinNum: pin,
|
|
248
|
+
meetingId: pending.meetingId,
|
|
249
|
+
newMeetingName: pending.newMeetingName,
|
|
250
|
+
memo: pending.memo,
|
|
251
|
+
});
|
|
252
|
+
await store.clear();
|
|
253
|
+
console.log(formatOutput({
|
|
254
|
+
ok: true,
|
|
255
|
+
reservationId: pending.reservationId,
|
|
256
|
+
branchName: pending.branchName,
|
|
257
|
+
boothGroupName: pending.boothGroupName,
|
|
258
|
+
date: pending.date,
|
|
259
|
+
startTime: pending.startTime,
|
|
260
|
+
endTime: pending.endTime,
|
|
261
|
+
message: result.resultMsg,
|
|
262
|
+
}, options.pretty));
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
handleError(error);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
async function reserveAction(options) {
|
|
269
|
+
try {
|
|
270
|
+
const identity = await resolveTozIdentity(options.name, options.phone, { promptPhone });
|
|
271
|
+
const durationMinutes = parseDurationFlag(options.duration);
|
|
272
|
+
const userCount = parseUserCount(options.userCount);
|
|
273
|
+
const boothId = parseStrictPositiveInt(options.boothId, 'booth-id');
|
|
274
|
+
const meetingId = options.meetingId ? parseStrictPositiveInt(options.meetingId, 'meeting-id') : undefined;
|
|
275
|
+
if (!meetingId && !options.newMeeting)
|
|
276
|
+
throw new Error('--meeting-id or --new-meeting is required');
|
|
277
|
+
const client = new TozClient();
|
|
278
|
+
stderr.info(`[1/4] Reserving booth ${boothId}...`);
|
|
279
|
+
const reserved = await client.reserveBooth({
|
|
280
|
+
date: options.date,
|
|
281
|
+
startTime: options.start,
|
|
282
|
+
durationMinutes,
|
|
283
|
+
userCount,
|
|
284
|
+
boothId,
|
|
285
|
+
});
|
|
286
|
+
stderr.info(` ok (reservationId=${reserved.reservationId}, ${reserved.branchName} ${reserved.boothGroupName})`);
|
|
287
|
+
stderr.info('[2/4] Skipping equipment...');
|
|
288
|
+
await client.skipEquipment({
|
|
289
|
+
reservationId: reserved.reservationId,
|
|
290
|
+
date: options.date,
|
|
291
|
+
startTime: options.start,
|
|
292
|
+
durationMinutes,
|
|
293
|
+
});
|
|
294
|
+
stderr.info(' ok');
|
|
295
|
+
stderr.info(`[3/4] Sending SMS to ${maskPhone(identity.phone)}...`);
|
|
296
|
+
await client.sendOtp(identity.phone);
|
|
297
|
+
stderr.info(' ok');
|
|
298
|
+
const pin = options.pin ?? (await promptPin());
|
|
299
|
+
stderr.info('[4/4] Confirming reservation...');
|
|
300
|
+
const result = await client.confirm({
|
|
301
|
+
reservationId: reserved.reservationId,
|
|
302
|
+
date: options.date,
|
|
303
|
+
startTime: options.start,
|
|
304
|
+
durationMinutes,
|
|
305
|
+
name: identity.name,
|
|
306
|
+
phone: identity.phone,
|
|
307
|
+
email: options.email,
|
|
308
|
+
pinNum: pin,
|
|
309
|
+
meetingId,
|
|
310
|
+
newMeetingName: options.newMeeting,
|
|
311
|
+
memo: options.memo,
|
|
312
|
+
});
|
|
313
|
+
stderr.info(' ok');
|
|
314
|
+
console.log(formatOutput({
|
|
315
|
+
ok: true,
|
|
316
|
+
reservationId: reserved.reservationId,
|
|
317
|
+
branchName: reserved.branchName,
|
|
318
|
+
boothGroupName: reserved.boothGroupName,
|
|
319
|
+
date: options.date,
|
|
320
|
+
startTime: options.start,
|
|
321
|
+
endTime: computeEndTime(options.start, durationMinutes),
|
|
322
|
+
message: result.resultMsg,
|
|
323
|
+
}, options.pretty));
|
|
324
|
+
}
|
|
325
|
+
catch (error) {
|
|
326
|
+
handleError(error);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
async function listAction(options) {
|
|
330
|
+
try {
|
|
331
|
+
const identity = await resolveTozIdentity(options.name, options.phone);
|
|
332
|
+
const reservations = await new TozClient().myReservations({
|
|
333
|
+
name: identity.name,
|
|
334
|
+
phone: identity.phone,
|
|
335
|
+
startDate: options.start,
|
|
336
|
+
endDate: options.end,
|
|
337
|
+
meetingName: options.meeting,
|
|
338
|
+
});
|
|
339
|
+
console.log(formatOutput(reservations, options.pretty));
|
|
340
|
+
}
|
|
341
|
+
catch (error) {
|
|
342
|
+
handleError(error);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
async function cancelAction(reservationId, options) {
|
|
346
|
+
try {
|
|
347
|
+
const id = parseStrictPositiveInt(reservationId, 'reservationId');
|
|
348
|
+
const identity = await resolveTozIdentity(options.name, options.phone);
|
|
349
|
+
await new TozClient().cancel({ reservationId: id, name: identity.name, phone: identity.phone });
|
|
350
|
+
console.log(formatOutput({ ok: true, message: '취소되었습니다.' }, options.pretty));
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
handleError(error);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
function maskPhone(phone) {
|
|
357
|
+
return phone.replace(/^(\d{3})-?(\d{3,4})-?(\d{4})$/, (_, a, _b, c) => `${a}-${'*'.repeat(_b.length)}-${c}`);
|
|
358
|
+
}
|
|
359
|
+
function computeEndTime(start, durationMinutes) {
|
|
360
|
+
const [h, m] = start.split(':').map((s) => Number.parseInt(s, 10));
|
|
361
|
+
const total = h * 60 + m + durationMinutes;
|
|
362
|
+
const eh = Math.floor(total / 60) % 24;
|
|
363
|
+
const em = total % 60;
|
|
364
|
+
return `${String(eh).padStart(2, '0')}:${String(em).padStart(2, '0')}`;
|
|
365
|
+
}
|
|
366
|
+
async function promptPin() {
|
|
367
|
+
const rl = createInterface({ input, output });
|
|
368
|
+
try {
|
|
369
|
+
const answer = await rl.question('Enter 6-digit PIN from SMS: ');
|
|
370
|
+
return answer.trim();
|
|
371
|
+
}
|
|
372
|
+
finally {
|
|
373
|
+
rl.close();
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
async function promptPhone() {
|
|
377
|
+
const rl = createInterface({ input, output });
|
|
378
|
+
try {
|
|
379
|
+
while (true) {
|
|
380
|
+
const answer = await rl.question('Phone number (e.g. 010-1234-5678): ');
|
|
381
|
+
const phone = answer.trim();
|
|
382
|
+
try {
|
|
383
|
+
return formatPhone(parsePhone(phone));
|
|
384
|
+
}
|
|
385
|
+
catch (error) {
|
|
386
|
+
stderr.warn(error instanceof Error ? error.message : String(error));
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
finally {
|
|
391
|
+
rl.close();
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
export const tozCommand = new Command('toz')
|
|
395
|
+
.description('Manage TOZ external meeting room reservations (SW마에스트로 partnership)')
|
|
396
|
+
.addCommand(new Command('login')
|
|
397
|
+
.description('Save TOZ identity (name + phone) to credentials')
|
|
398
|
+
.requiredOption('--name <name>', 'Reservation holder name')
|
|
399
|
+
.requiredOption('--phone <phone>', 'Phone number, e.g. 010-1234-5678')
|
|
400
|
+
.option('--pretty', 'Pretty print JSON output')
|
|
401
|
+
.action(loginAction))
|
|
402
|
+
.addCommand(new Command('logout')
|
|
403
|
+
.description('Clear stored TOZ identity and pending reservation state')
|
|
404
|
+
.option('--pretty', 'Pretty print JSON output')
|
|
405
|
+
.action(logoutAction))
|
|
406
|
+
.addCommand(new Command('status')
|
|
407
|
+
.description('Show stored TOZ identity')
|
|
408
|
+
.option('--pretty', 'Pretty print JSON output')
|
|
409
|
+
.action(statusAction))
|
|
410
|
+
.addCommand(new Command('branches')
|
|
411
|
+
.description('List partner branches (live from booking.htm)')
|
|
412
|
+
.option('--pretty', 'Pretty print JSON output')
|
|
413
|
+
.action(branchesAction))
|
|
414
|
+
.addCommand(new Command('meetings')
|
|
415
|
+
.description('List active SW마에스트로 meetings (live from booking.htm)')
|
|
416
|
+
.option('--pretty', 'Pretty print JSON output')
|
|
417
|
+
.action(meetingsAction))
|
|
418
|
+
.addCommand(new Command('available')
|
|
419
|
+
.description('Show available booths for one date+time+duration')
|
|
420
|
+
.requiredOption('--date <date>', 'YYYY-MM-DD')
|
|
421
|
+
.requiredOption('--start <time>', 'HH:MM')
|
|
422
|
+
.requiredOption('--duration <duration>', 'e.g. 2h, 150m, 120 (default minutes)')
|
|
423
|
+
.requiredOption('--user-count <n>', 'Number of attendees')
|
|
424
|
+
.option('--branch <id-or-name...>', 'Branch IDs or names (default: all 9)')
|
|
425
|
+
.option('--pretty', 'Pretty print JSON output')
|
|
426
|
+
.action(availableAction))
|
|
427
|
+
.addCommand(new Command('check')
|
|
428
|
+
.description('Check booth availability for multiple times (max 6, serial)')
|
|
429
|
+
.requiredOption('--date <date>', 'YYYY-MM-DD')
|
|
430
|
+
.requiredOption('--time <time...>', 'HH:MM (repeatable, max 6)')
|
|
431
|
+
.requiredOption('--duration <duration>', 'e.g. 2h')
|
|
432
|
+
.requiredOption('--user-count <n>', 'Number of attendees')
|
|
433
|
+
.option('--branch <id-or-name...>', 'Branch IDs or names')
|
|
434
|
+
.option('--pretty', 'Pretty print JSON output')
|
|
435
|
+
.action(checkAction))
|
|
436
|
+
.addCommand(new Command('reserve-request')
|
|
437
|
+
.description('Step 1 of non-interactive reservation: hold booth + send SMS')
|
|
438
|
+
.requiredOption('--date <date>', 'YYYY-MM-DD')
|
|
439
|
+
.requiredOption('--start <time>', 'HH:MM')
|
|
440
|
+
.requiredOption('--duration <duration>', 'e.g. 2h')
|
|
441
|
+
.requiredOption('--user-count <n>', 'Number of attendees')
|
|
442
|
+
.requiredOption('--booth-id <id>', 'Booth ID from `toz available`')
|
|
443
|
+
.option('--meeting-id <id>', 'Meeting ID from `toz meetings`')
|
|
444
|
+
.option('--new-meeting <name>', 'Create a new meeting with this name')
|
|
445
|
+
.requiredOption('--email <email>', 'Contact email')
|
|
446
|
+
.option('--memo <text>', 'Reservation memo')
|
|
447
|
+
.option('--name <name>', 'Override stored name')
|
|
448
|
+
.option('--phone <phone>', 'Override stored phone')
|
|
449
|
+
.option('--pretty', 'Pretty print JSON output')
|
|
450
|
+
.action(reserveRequestAction))
|
|
451
|
+
.addCommand(new Command('reserve-confirm')
|
|
452
|
+
.description('Step 2 of non-interactive reservation: finalize with PIN')
|
|
453
|
+
.option('--pin <pin>', '6-digit PIN from SMS (prompts if omitted)')
|
|
454
|
+
.option('--pretty', 'Pretty print JSON output')
|
|
455
|
+
.action(reserveConfirmAction))
|
|
456
|
+
.addCommand(new Command('reserve')
|
|
457
|
+
.description('Interactive single-process reservation (prompts for PIN)')
|
|
458
|
+
.requiredOption('--date <date>', 'YYYY-MM-DD')
|
|
459
|
+
.requiredOption('--start <time>', 'HH:MM')
|
|
460
|
+
.requiredOption('--duration <duration>', 'e.g. 2h')
|
|
461
|
+
.requiredOption('--user-count <n>', 'Number of attendees')
|
|
462
|
+
.requiredOption('--booth-id <id>', 'Booth ID')
|
|
463
|
+
.option('--meeting-id <id>', 'Meeting ID')
|
|
464
|
+
.option('--new-meeting <name>', 'Create new meeting with this name')
|
|
465
|
+
.requiredOption('--email <email>', 'Contact email')
|
|
466
|
+
.option('--memo <text>', 'Reservation memo')
|
|
467
|
+
.option('--name <name>', 'Override stored name')
|
|
468
|
+
.option('--phone <phone>', 'Override stored phone')
|
|
469
|
+
.option('--pin <pin>', 'PIN if already received (skip prompt)')
|
|
470
|
+
.option('--pretty', 'Pretty print JSON output')
|
|
471
|
+
.action(reserveAction))
|
|
472
|
+
.addCommand(new Command('list')
|
|
473
|
+
.description('List my TOZ reservations')
|
|
474
|
+
.option('--start <date>', 'YYYY-MM-DD')
|
|
475
|
+
.option('--end <date>', 'YYYY-MM-DD')
|
|
476
|
+
.option('--meeting <name>', 'Filter by meeting name')
|
|
477
|
+
.option('--name <name>', 'Override stored name')
|
|
478
|
+
.option('--phone <phone>', 'Override stored phone')
|
|
479
|
+
.option('--pretty', 'Pretty print JSON output')
|
|
480
|
+
.action(listAction))
|
|
481
|
+
.addCommand(new Command('cancel')
|
|
482
|
+
.description('Cancel a TOZ reservation')
|
|
483
|
+
.argument('<reservationId>')
|
|
484
|
+
.option('--name <name>', 'Override stored name')
|
|
485
|
+
.option('--phone <phone>', 'Override stored phone')
|
|
486
|
+
.option('--pretty', 'Pretty print JSON output')
|
|
487
|
+
.action(cancelAction));
|
|
488
|
+
//# sourceMappingURL=toz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toz.js","sourceRoot":"","sources":["../../../src/commands/toz.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,13 +14,19 @@ export declare class CredentialManager {
|
|
|
14
14
|
remove(): Promise<void>;
|
|
15
15
|
/**
|
|
16
16
|
* Wipe ephemeral session fields (sessionCookie, csrfToken, loggedInAt) while
|
|
17
|
-
* preserving long-term
|
|
18
|
-
* server-side session expired but we still want automatic recovery on the
|
|
17
|
+
* preserving long-term material (username, password, TOZ identity). Used when
|
|
18
|
+
* the server-side session expired but we still want automatic recovery on the
|
|
19
19
|
* next run via `recoverSession()`.
|
|
20
20
|
*
|
|
21
21
|
* No-op when no credentials file exists or no recovery material is stored.
|
|
22
22
|
*/
|
|
23
23
|
clearSessionState(): Promise<void>;
|
|
24
|
+
setTozIdentity(name: string, phone: string): Promise<void>;
|
|
25
|
+
clearTozIdentity(): Promise<void>;
|
|
26
|
+
getTozIdentity(): Promise<{
|
|
27
|
+
name: string;
|
|
28
|
+
phone: string;
|
|
29
|
+
} | null>;
|
|
24
30
|
private hydrateCredentials;
|
|
25
31
|
private serializeCredentials;
|
|
26
32
|
private encryptSecret;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-manager.d.ts","sourceRoot":"","sources":["../../src/credential-manager.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAY1C,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,WAAW,GAAG,IAAI,CAAA;CAChC;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,iBAAiB,CAAQ;gBAErB,SAAS,CAAC,EAAE,MAAM;IAMxB,IAAI,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAgBjC,IAAI,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAe7C,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAK7C,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B;;;;;;;OAOG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"credential-manager.d.ts","sourceRoot":"","sources":["../../src/credential-manager.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAY1C,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,WAAW,GAAG,IAAI,CAAA;CAChC;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,iBAAiB,CAAQ;gBAErB,SAAS,CAAC,EAAE,MAAM;IAMxB,IAAI,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAgBjC,IAAI,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAe7C,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAK7C,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B;;;;;;;OAOG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBlC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1D,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC,cAAc,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;YAMzD,kBAAkB;YAUlB,oBAAoB;YAYpB,aAAa;YAab,aAAa;YAgBb,wBAAwB;YAYxB,wBAAwB;CAWvC"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { createCipheriv, createDecipheriv, randomBytes } from 'node:crypto';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { chmod, mkdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
4
|
-
import { homedir } from 'node:os';
|
|
5
4
|
import { join } from 'node:path';
|
|
5
|
+
import { getConfigDir } from './shared/utils/config-dir.js';
|
|
6
6
|
export class CredentialManager {
|
|
7
7
|
configDir;
|
|
8
8
|
credentialsPath;
|
|
9
9
|
encryptionKeyPath;
|
|
10
10
|
constructor(configDir) {
|
|
11
|
-
this.configDir = configDir ??
|
|
11
|
+
this.configDir = configDir ?? getConfigDir();
|
|
12
12
|
this.credentialsPath = join(this.configDir, 'credentials.json');
|
|
13
13
|
this.encryptionKeyPath = join(this.configDir, 'credentials.key');
|
|
14
14
|
}
|
|
@@ -47,8 +47,8 @@ export class CredentialManager {
|
|
|
47
47
|
}
|
|
48
48
|
/**
|
|
49
49
|
* Wipe ephemeral session fields (sessionCookie, csrfToken, loggedInAt) while
|
|
50
|
-
* preserving long-term
|
|
51
|
-
* server-side session expired but we still want automatic recovery on the
|
|
50
|
+
* preserving long-term material (username, password, TOZ identity). Used when
|
|
51
|
+
* the server-side session expired but we still want automatic recovery on the
|
|
52
52
|
* next run via `recoverSession()`.
|
|
53
53
|
*
|
|
54
54
|
* No-op when no credentials file exists or no recovery material is stored.
|
|
@@ -58,7 +58,7 @@ export class CredentialManager {
|
|
|
58
58
|
if (!current) {
|
|
59
59
|
return;
|
|
60
60
|
}
|
|
61
|
-
if (!current.username && !current.password) {
|
|
61
|
+
if (!current.username && !current.password && !current.tozName && !current.tozPhone) {
|
|
62
62
|
await this.remove();
|
|
63
63
|
return;
|
|
64
64
|
}
|
|
@@ -67,8 +67,30 @@ export class CredentialManager {
|
|
|
67
67
|
csrfToken: '',
|
|
68
68
|
username: current.username,
|
|
69
69
|
password: current.password,
|
|
70
|
+
tozName: current.tozName,
|
|
71
|
+
tozPhone: current.tozPhone,
|
|
70
72
|
});
|
|
71
73
|
}
|
|
74
|
+
async setTozIdentity(name, phone) {
|
|
75
|
+
const existing = await this.getCredentials();
|
|
76
|
+
if (!existing) {
|
|
77
|
+
throw new Error('SWMaestro credentials not found. Run: opensoma auth login first.');
|
|
78
|
+
}
|
|
79
|
+
await this.setCredentials({ ...existing, tozName: name, tozPhone: phone });
|
|
80
|
+
}
|
|
81
|
+
async clearTozIdentity() {
|
|
82
|
+
const existing = await this.getCredentials();
|
|
83
|
+
if (!existing)
|
|
84
|
+
return;
|
|
85
|
+
const { tozName: _name, tozPhone: _phone, ...rest } = existing;
|
|
86
|
+
await this.setCredentials(rest);
|
|
87
|
+
}
|
|
88
|
+
async getTozIdentity() {
|
|
89
|
+
const creds = await this.getCredentials();
|
|
90
|
+
if (!creds?.tozName || !creds?.tozPhone)
|
|
91
|
+
return null;
|
|
92
|
+
return { name: creds.tozName, phone: creds.tozPhone };
|
|
93
|
+
}
|
|
72
94
|
async hydrateCredentials(credentials) {
|
|
73
95
|
if (!credentials.encryptedPassword) {
|
|
74
96
|
return credentials;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-manager.js","sourceRoot":"","sources":["../../src/credential-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACxE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"credential-manager.js","sourceRoot":"","sources":["../../src/credential-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -8,6 +8,10 @@ export type { UserIdentity } from './http.js';
|
|
|
8
8
|
export { CredentialManager } from './credential-manager.js';
|
|
9
9
|
export { TozHttp } from './toz-http.js';
|
|
10
10
|
export type { TozHttpOptions, TozHttpState } from './toz-http.js';
|
|
11
|
+
export { TozClient } from './toz-client.js';
|
|
12
|
+
export type { TozAvailabilityQuery, TozCancelArgs, TozCheckQuery, TozCheckResult, TozClientOptions, TozConfirmArgs, TozReserveBoothArgs, TozSearchArgs, } from './toz-client.js';
|
|
13
|
+
export { TozPendingStore } from './toz-pending-store.js';
|
|
14
|
+
export type { TozPendingReservation } from './toz-pending-store.js';
|
|
11
15
|
export * from './toz-formatters.js';
|
|
12
16
|
export * from './types.js';
|
|
13
17
|
export * from './constants.js';
|