Zpracování chyb z API

This commit is contained in:
2023-09-18 22:38:04 +02:00
parent 8a67325c85
commit bc181defa8
5 changed files with 96 additions and 45 deletions

View File

@@ -1,7 +1,7 @@
import { formatDate, getDayOfWeekIndex, getHumanDate, getHumanTime, getIsWeekend } from "./utils";
import { InsufficientPermissions, formatDate, getDayOfWeekIndex, getHumanDate, getHumanTime, getIsWeekend } from "./utils";
import { callNotifikace } from "./notifikace";
import { generateQr } from "./qr";
import { ClientData, PizzaDayState, UdalostEnum, Pizza, PizzaSize, Order, PizzaOrder, Locations, Restaurants, Food, Menu } from "../../types";
import { ClientData, PizzaDayState, UdalostEnum, Pizza, PizzaSize, Order, PizzaOrder, Locations, Restaurants, Menu } from "../../types";
import getStorage from "./storage";
import { getMenuSladovnicka, getMenuTechTower, getMenuUMotliku } from "./restaurants";
import { downloadPizzy } from "./chefie";
@@ -345,14 +345,15 @@ export async function initIfNeeded(date?: Date) {
* Odstraní kompletně volbu uživatele (včetně případných podřízených jídel).
*
* @param login login uživatele
* @param trusted příznak, zda se jedná o ověřeného uživatele
* @param location vybrané "umístění"
* @param date datum, ke kterému se volba vztahuje
* @returns
*/
export async function removeChoices(login: string, location: Locations, date?: Date) {
export async function removeChoices(login: string, trusted: boolean, location: Locations, date?: Date) {
const selectedDay = formatDate(date ?? getToday());
let data: ClientData = await storage.getData(selectedDay);
// TODO zajistit, že neověřený uživatel se stejným loginem nemůže mazat volby ověřeného
validateTrusted(data, login, trusted);
if (location in data.choices) {
if (login in data.choices[location]) {
delete data.choices[location][login]
@@ -370,15 +371,16 @@ export async function removeChoices(login: string, location: Locations, date?: D
* Neodstraňuje volbu samotnou, k tomu slouží {@link removeChoices}.
*
* @param login login uživatele
* @param trusted příznak, zda se jedná o ověřeného uživatele
* @param location vybrané "umístění"
* @param foodIndex index jídla v jídelním lístku daného umístění, pokud existuje
* @param date datum, ke kterému se volba vztahuje
* @returns
*/
export async function removeChoice(login: string, location: Locations, foodIndex: number, date?: Date) {
export async function removeChoice(login: string, trusted: boolean, location: Locations, foodIndex: number, date?: Date) {
const selectedDay = formatDate(date ?? getToday());
let data: ClientData = await storage.getData(selectedDay);
// TODO řešit ověření uživatele
validateTrusted(data, login, trusted);
if (location in data.choices) {
if (login in data.choices[location]) {
const index = data.choices[location][login].options.indexOf(foodIndex);
@@ -411,20 +413,13 @@ async function removeChoiceIfPresent(login: string, date: string) {
}
/**
* Přidá volbu uživatele.
* Ověří, zda se neověřený uživatel nepokouší přepsat údaje ověřeného a případně vyhodí chybu.
*
* @param login login uživatele
* @param location vybrané "umístění"
* @param foodIndex volitelný index jídla v daném umístění
* @param data aktuální klientská data
* @param login přihlašovací jméno uživatele
* @param trusted příznak, zda se jedná o ověřeného uživatele
* @param date datum, ke kterému se volba vztahuje
* @returns aktuální data
*/
export async function addChoice(login: string, trusted: boolean, location: Locations, foodIndex?: number, date?: Date) {
await initIfNeeded();
const selectedDate = formatDate(date ?? getToday());
let data: ClientData = await storage.getData(selectedDate);
// Ověření, že se neověřený užívatel nepokouší přepsat údaje ověřeného
function validateTrusted(data: ClientData, login: string, trusted: boolean) {
const locations = Object.values(data?.choices);
let found = false;
if (!trusted) {
@@ -435,8 +430,26 @@ export async function addChoice(login: string, trusted: boolean, location: Locat
}
}
if (!trusted && found) {
throw Error("Nelze změnit volbu ověřeného uživatele");
throw new InsufficientPermissions("Nelze změnit volbu ověřeného uživatele");
}
}
/**
* Přidá volbu uživatele.
*
* @param login login uživatele
* @param trusted příznak, zda se jedná o ověřeného uživatele
* @param location vybrané "umístění"
* @param foodIndex volitelný index jídla v daném umístění
* @param trusted příznak, zda se jedná o ověřeného uživatele
* @param date datum, ke kterému se volba vztahuje
* @returns aktuální data
*/
export async function addChoice(login: string, trusted: boolean, location: Locations, foodIndex?: number, date?: Date) {
await initIfNeeded();
const selectedDate = formatDate(date ?? getToday());
let data: ClientData = await storage.getData(selectedDate);
validateTrusted(data, login, trusted);
// Pokud měníme pouze lokaci, mažeme případné předchozí
if (foodIndex == null) {
data = await removeChoiceIfPresent(login, selectedDate);