fix: opravy po review
CI / Generate TypeScript types (push) Successful in 10s
CI / Server unit tests (push) Successful in 21s
CI / Generate TypeScript types (pull_request) Successful in 47s
CI / Build server (push) Successful in 27s
CI / Server unit tests (pull_request) Successful in 20s
CI / Build server (pull_request) Successful in 27s
CI / Build client (pull_request) Successful in 40s
CI / Playwright E2E tests (pull_request) Successful in 1m20s
CI / Build and push Docker image (pull_request) Has been skipped
CI / Notify (pull_request) Has been skipped
CI / Build client (push) Successful in 4m13s
CI / Playwright E2E tests (push) Successful in 6m7s
CI / Build and push Docker image (push) Has been skipped
CI / Notify (push) Successful in 6s

This commit is contained in:
2026-05-07 08:56:49 +02:00
parent 21d7224fb4
commit 5f03471541
14 changed files with 359 additions and 88 deletions
+31 -3
View File
@@ -2,6 +2,7 @@ import crypto from "crypto";
import getStorage from "./storage";
import { getClientData, getToday, initIfNeeded } from "./service";
import { getStores } from "./stores";
import { removePendingQrsByGroupId } from "./pizza";
import { ClientData, GroupState, MealSlot, OrderGroup, OrderGroupMember } from "../../types/gen/types.gen";
import { formatDate } from "./utils";
@@ -9,7 +10,9 @@ const storage = getStorage();
async function getExtraData(date?: Date): Promise<ClientData> {
await initIfNeeded(date, MealSlot.EXTRA);
return getClientData(date, MealSlot.EXTRA);
const data = await getClientData(date, MealSlot.EXTRA);
data.stores = await getStores();
return data;
}
function getExtraKey(date?: Date): string {
@@ -31,9 +34,10 @@ export async function createGroup(creatorLogin: string, name: string, date?: Dat
throw new Error('Obchod není v seznamu povolených obchodů');
}
const data = await getExtraData(date);
const canonical = stores.find(s => s.toLowerCase() === name.trim().toLowerCase())!;
const group: OrderGroup = {
id: crypto.randomUUID(),
name: name.trim(),
name: canonical,
creatorLogin,
state: GroupState.OPEN,
members: { [creatorLogin]: {} },
@@ -103,9 +107,14 @@ export async function updateGroupMember(login: string, groupId: string, targetLo
const VALID_TRANSITIONS: Record<GroupState, GroupState[]> = {
[GroupState.OPEN]: [GroupState.LOCKED],
[GroupState.LOCKED]: [GroupState.OPEN, GroupState.ORDERED],
[GroupState.ORDERED]: [],
[GroupState.ORDERED]: [GroupState.LOCKED],
};
function getCurrentHHMM(): string {
const now = new Date();
return `${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`;
}
export async function setGroupState(login: string, groupId: string, newState: GroupState, date?: Date): Promise<ClientData> {
const data = await getExtraData(date);
const group = findGroup(data, groupId);
@@ -114,6 +123,25 @@ export async function setGroupState(login: string, groupId: string, newState: Gr
if (!VALID_TRANSITIONS[group.state].includes(newState)) {
throw new Error(`Nelze přejít ze stavu "${group.state}" do stavu "${newState}"`);
}
if (newState === GroupState.ORDERED) {
group.orderedAt = getCurrentHHMM();
}
if (group.state === GroupState.ORDERED && newState === GroupState.LOCKED) {
const memberLogins = Object.keys(group.members);
await removePendingQrsByGroupId(memberLogins, groupId);
group.orderedAt = undefined;
group.deliveryAt = undefined;
}
group.state = newState;
return saveExtraData(data, date);
}
export async function updateGroupTimes(login: string, groupId: string, orderedAt?: string, deliveryAt?: 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('Časy může měnit pouze zakladatel');
if (orderedAt !== undefined) group.orderedAt = orderedAt || undefined;
if (deliveryAt !== undefined) group.deliveryAt = deliveryAt || undefined;
return saveExtraData(data, date);
}