feat: sledování objednávek přes Wolt
CI / Generate TypeScript types (push) Successful in 13s
CI / Server unit tests (push) Successful in 25s
CI / Build server (push) Successful in 28s
CI / Build client (push) Successful in 41s
CI / Playwright E2E tests (push) Successful in 1m47s
CI / Build and push Docker image (push) Successful in 53s
CI / Notify (push) Successful in 2s
CI / Generate TypeScript types (push) Successful in 13s
CI / Server unit tests (push) Successful in 25s
CI / Build server (push) Successful in 28s
CI / Build client (push) Successful in 41s
CI / Playwright E2E tests (push) Successful in 1m47s
CI / Build and push Docker image (push) Successful in 53s
CI / Notify (push) Successful in 2s
Vedle Bolt Food jde nově sledovat i objednávka z Woltu — stačí u objednané skupiny vložit odkaz z track.wolt.com. Logika sledování je zobecněná do registru rozvozových služeb (trackingProviders.ts): každá služba umí vytáhnout kód ze sdílecího odkazu a dotázat se svého API, scheduler i stepper jsou společné. - pole skupiny bolt* přejmenována na tracking* + nové trackingProvider - endpoint /groups/setBoltTracking → /groups/setTracking - Wolt: čas doručení z delivery_eta v časové zóně objednávky, 404 ukončí sledování, stav kurýra odvozen z is_delivering/is_delivering_other_order - DEV simulace zůstává jen pro Bolt Food
This commit is contained in:
+19
-16
@@ -3,7 +3,7 @@ import getStorage from "./storage";
|
||||
import { getClientData, getToday, initIfNeeded } from "./service";
|
||||
import { getStores } from "./stores";
|
||||
import { removePendingQrsByGroupId } from "./pizza";
|
||||
import { extractBoltToken } from "./boltTracking";
|
||||
import { extractTracking } from "./trackingProviders";
|
||||
import { ClientData, GroupState, MealSlot, OrderGroup, OrderGroupMember } from "../../types/gen/types.gen";
|
||||
import { formatDate } from "./utils";
|
||||
|
||||
@@ -151,9 +151,10 @@ export async function setGroupState(login: string, groupId: string, newState: Gr
|
||||
group.orderedAt = undefined;
|
||||
group.deliveryAt = undefined;
|
||||
group.qrGenerated = undefined;
|
||||
group.boltTrackingToken = undefined;
|
||||
group.boltOrderState = undefined;
|
||||
group.boltCourierState = undefined;
|
||||
group.trackingProvider = undefined;
|
||||
group.trackingCode = undefined;
|
||||
group.trackingOrderState = undefined;
|
||||
group.trackingCourierState = undefined;
|
||||
for (const ml of memberLogins) {
|
||||
group.members[ml] = { ...group.members[ml], paid: undefined };
|
||||
}
|
||||
@@ -204,24 +205,26 @@ export async function updateGroupTimes(login: string, groupId: string, orderedAt
|
||||
return saveExtraData(data, date);
|
||||
}
|
||||
|
||||
export async function setGroupBoltTracking(login: string, groupId: string, shareUrl?: string, date?: Date): Promise<ClientData> {
|
||||
export async function setGroupTracking(login: string, groupId: string, shareUrl?: string, date?: Date): Promise<ClientData> {
|
||||
const data = await getExtraData(date);
|
||||
const group = findGroup(data, groupId);
|
||||
if (!group) throw new Error('Skupina nebyla nalezena');
|
||||
if (group.creatorLogin !== login) throw new Error('Sledování Bolt může nastavit pouze zakladatel');
|
||||
if (group.creatorLogin !== login) throw new Error('Sledování objednávky může nastavit pouze zakladatel');
|
||||
if (!shareUrl) {
|
||||
group.boltTrackingToken = undefined;
|
||||
group.boltOrderState = undefined;
|
||||
group.boltCourierState = undefined;
|
||||
group.trackingProvider = undefined;
|
||||
group.trackingCode = undefined;
|
||||
group.trackingOrderState = undefined;
|
||||
group.trackingCourierState = undefined;
|
||||
} else {
|
||||
if (group.state !== GroupState.ORDERED) throw new Error('Sledování Bolt lze nastavit pouze ve stavu "objednáno"');
|
||||
const token = extractBoltToken(shareUrl);
|
||||
if (!token) throw new Error('Neplatný odkaz na sledování objednávky Bolt');
|
||||
if (token !== group.boltTrackingToken) {
|
||||
group.boltTrackingToken = token;
|
||||
if (group.state !== GroupState.ORDERED) throw new Error('Sledování objednávky lze nastavit pouze ve stavu "objednáno"');
|
||||
const tracking = extractTracking(shareUrl);
|
||||
if (!tracking) throw new Error('Neplatný odkaz na sledování objednávky');
|
||||
if (tracking.code !== group.trackingCode || tracking.provider !== group.trackingProvider) {
|
||||
group.trackingProvider = tracking.provider;
|
||||
group.trackingCode = tracking.code;
|
||||
// Stav patří k předchozí objednávce — vyčistíme, doplní ho první poll
|
||||
group.boltOrderState = undefined;
|
||||
group.boltCourierState = undefined;
|
||||
group.trackingOrderState = undefined;
|
||||
group.trackingCourierState = undefined;
|
||||
}
|
||||
}
|
||||
return saveExtraData(data, date);
|
||||
|
||||
Reference in New Issue
Block a user