Merge branch 'feature/terminplaner-tp2' into feature/webshop
This commit is contained in:
commit
a4a18a1c89
8 files changed
+367
-83
No files matched your search
@@ -1,5 +1,5 @@
|
||||
import { config } from '../../config.js'
|
||||
import { Query, countDocuments, createDocument, deleteDocument, getDocument, listAllDocuments, listDocuments, updateDocument } from '../appwriteAdmin.js'
|
||||
import { Query, countDocuments, createDocument, deleteDocument, getDocument, keinerVon, listAllDocuments, listDocuments, updateDocument } from '../appwriteAdmin.js'
|
||||
import { withLocks } from '../keyedLock.js'
|
||||
import { sendGuestMail } from '../mailer.js'
|
||||
import { renderMail } from '../mailTemplates.js'
|
||||
@@ -376,16 +376,24 @@ async function speichereFehlschlag(doc, err, nowMs) {
|
||||
const KLASSEN = ['vorrang', 'normal', 'nachrangig']
|
||||
/** Hoechstens so viele Abfragen je Klasse und Lauf: die erste und bis zu vier weitere Runden mit neuer Ausschlussliste. */
|
||||
const RUNDEN_MAX = 5
|
||||
/** Hoechstens so viele Funktionen in der Ausschlussliste einer Abfrage (Appwrite erlaubt hoechstens 100 Werte je Abfrage). */
|
||||
const AUSSCHLUSS_MAX = 90
|
||||
/**
|
||||
* Hoechstens so viele Funktionen in der Ausschlussliste einer Abfrage. Jede ist ein eigenes notEqual in der URL (Appwrite 1.8.1
|
||||
* nimmt je notEqual nur einen Wert, M1). Gemessen am Produktionsserver (M4, 2026-10-05): in dieser Abfrageform antwortet der nginx
|
||||
* ab 46 Funktions-IDs mit 36 Zeichen mit 414 (URL zu lang); 30 lassen Luft fuer laengere IDs. Eine blockierte Funktion ausserhalb
|
||||
* der Liste wird gelesen und uebersprungen (verarbeiteKlasse), das kostet nur Platz in der Liste.
|
||||
*/
|
||||
export const AUSSCHLUSS_MAX = 30
|
||||
/** Die Felder der Liste: genug fuer pruefePlatz und sendeEintrag, nie ein Mailtext. */
|
||||
const LISTENFELDER = ['$id', 'featureId', 'art', 'naechsterVersuch']
|
||||
|
||||
/** Filter auf die Art der Mail: die Arten der Klasse (equal) bzw. alle anderen (notEqual, die Klasse normal). */
|
||||
/**
|
||||
* Filter auf die Art der Mail, immer eine Liste von Abfragen: die Arten der Klasse (equal mit Liste, das erlaubt Appwrite) bzw.
|
||||
* alle anderen (die Klasse normal: je Art ein notEqual, Appwrite schneidet sie; art ist an jedem Eintrag gesetzt, einreihen prueft es).
|
||||
*/
|
||||
function klassenFilter(klasse) {
|
||||
if (klasse === 'vorrang') return Query.equal('art', [...MAIL_VORRANG])
|
||||
if (klasse === 'nachrangig') return Query.equal('art', [...MAIL_NACHRANGIG])
|
||||
return Query.notEqual('art', [...MAIL_VORRANG, ...MAIL_NACHRANGIG])
|
||||
if (klasse === 'vorrang') return [Query.equal('art', [...MAIL_VORRANG])]
|
||||
if (klasse === 'nachrangig') return [Query.equal('art', [...MAIL_NACHRANGIG])]
|
||||
return keinerVon('art', [...MAIL_VORRANG, ...MAIL_NACHRANGIG])
|
||||
}
|
||||
|
||||
/** Eine Runde der Klasse: faellige wartende Eintraege, fuer die Funktionen ohne Kontingent nicht mitgelesen werden. */
|
||||
@@ -393,8 +401,8 @@ function listenAbfrage(klasse, nowMs, blockiert) {
|
||||
return [
|
||||
Query.equal('status', 'wartet'),
|
||||
Query.lessThanEqual('naechsterVersuch', iso(nowMs)),
|
||||
klassenFilter(klasse),
|
||||
...(blockiert.size > 0 ? [Query.notEqual('featureId', [...blockiert].slice(0, AUSSCHLUSS_MAX))] : []),
|
||||
...klassenFilter(klasse),
|
||||
...keinerVon('featureId', [...blockiert].slice(0, AUSSCHLUSS_MAX)),
|
||||
Query.orderAsc('naechsterVersuch'),
|
||||
Query.limit(config.termine.mailListe),
|
||||
Query.select(LISTENFELDER),
|
||||
|
||||
Reference in new issue
Block a user