feat(seed): mitgelieferte Vorlagen am Schluessel erkennen (#42)
This commit was merged in pull request #42.
This commit is contained in:
@@ -68,11 +68,61 @@ export type GesaeteVorlage = {
|
||||
readonly neu: boolean;
|
||||
};
|
||||
|
||||
/**
|
||||
* Sucht die mitgelieferte Vorlage – zuerst am Schluessel, dann am Namen.
|
||||
*
|
||||
* Der Schluessel ueberlebt ein Umbenennen, der Name nicht: genau daran legte der
|
||||
* Seed eine umbenannte Vorlage ein zweites Mal an, und der Schnellstart stand
|
||||
* auf der Geraeteseite doppelt (#021). Der Rueckfall auf den Namen bleibt, weil
|
||||
* eine Installation von vor diesem Feld noch keinen Schluessel hat — ohne ihn
|
||||
* bekaeme sie beim ersten Lauf danach genau die Dubletten, die das Feld
|
||||
* verhindern soll. Wird sie so gefunden, traegt der Seed den Schluessel nach.
|
||||
*
|
||||
* Auch eine **archivierte** Vorlage gilt als vorhanden: eine zweite gleichen
|
||||
* Namens danebenzustellen waere keine Hilfe, sondern eine Dublette in jeder
|
||||
* Liste. Wer die Beispielvorlage zurueck will, holt sie aus dem Archiv.
|
||||
*/
|
||||
async function mitgelieferteFinden(db: PrismaClient, dokument: Austausch) {
|
||||
const mitVersion = {
|
||||
versionen: {
|
||||
where: { status: VersionStatus.VEROEFFENTLICHT },
|
||||
orderBy: { version: "desc" as const },
|
||||
take: 1,
|
||||
},
|
||||
};
|
||||
|
||||
if (dokument.seedSchluessel !== undefined) {
|
||||
const amSchluessel = await db.vorlage.findFirst({
|
||||
where: { seedSchluessel: dokument.seedSchluessel },
|
||||
include: mitVersion,
|
||||
});
|
||||
if (amSchluessel) return amSchluessel;
|
||||
}
|
||||
|
||||
const amNamen = await db.vorlage.findFirst({
|
||||
// Nur eine Zeile **ohne** Schluessel darf hier zugeordnet werden. Sonst
|
||||
// koennte eine fremde Vorlage, die zufaellig so heisst wie die mitgelieferte,
|
||||
// deren Schluessel bekommen - und der naechste Lauf wuerde sie fuer das
|
||||
// Original halten.
|
||||
where: { name: dokument.name, kundeId: null, seedSchluessel: null },
|
||||
include: mitVersion,
|
||||
});
|
||||
if (amNamen && dokument.seedSchluessel !== undefined) {
|
||||
await db.vorlage.update({
|
||||
where: { id: amNamen.id },
|
||||
data: { seedSchluessel: dokument.seedSchluessel },
|
||||
});
|
||||
console.log(` Vorlage „${amNamen.name}“: Schlüssel ${dokument.seedSchluessel} nachgetragen`);
|
||||
}
|
||||
return amNamen;
|
||||
}
|
||||
|
||||
/**
|
||||
* Legt die Vorlagen als veroeffentlichte Version 1 an.
|
||||
*
|
||||
* Idempotent ueber den **Namen**: gibt es die Vorlage schon, bleibt sie
|
||||
* unangetastet — auch dann, wenn jemand sie inzwischen bearbeitet hat. Ein
|
||||
* Idempotent ueber den **Schluessel** (Rueckfall: Name, siehe
|
||||
* `mitgelieferteFinden`): gibt es die Vorlage schon, bleibt sie unangetastet —
|
||||
* auch dann, wenn jemand sie inzwischen bearbeitet oder umbenannt hat. Ein
|
||||
* zweiter Seed-Lauf darf die Arbeit eines Redakteurs nicht zurueckdrehen, und
|
||||
* eine veroeffentlichte Version wird ohnehin nie veraendert.
|
||||
*/
|
||||
@@ -82,19 +132,7 @@ export async function vorlagenSaeen(db: PrismaClient): Promise<readonly GesaeteV
|
||||
let uebersprungen = 0;
|
||||
|
||||
for (const { dokument } of vorlagenLesen()) {
|
||||
const vorhanden = await db.vorlage.findFirst({
|
||||
// Auch eine **archivierte** Vorlage gilt als vorhanden: eine zweite gleichen
|
||||
// Namens danebenzustellen waere keine Hilfe, sondern eine Dublette in jeder
|
||||
// Liste. Wer die Beispielvorlage zurueck will, holt sie aus dem Archiv.
|
||||
where: { name: dokument.name, kundeId: null },
|
||||
include: {
|
||||
versionen: {
|
||||
where: { status: VersionStatus.VEROEFFENTLICHT },
|
||||
orderBy: { version: "desc" },
|
||||
take: 1,
|
||||
},
|
||||
},
|
||||
});
|
||||
const vorhanden = await mitgelieferteFinden(db, dokument);
|
||||
const veroeffentlichte = vorhanden?.versionen[0];
|
||||
if (vorhanden && veroeffentlichte) {
|
||||
ergebnis.push({
|
||||
@@ -131,6 +169,7 @@ export async function vorlagenSaeen(db: PrismaClient): Promise<readonly GesaeteV
|
||||
beschreibung: dokument.beschreibung ?? null,
|
||||
kategorie: dokument.kategorie ?? null,
|
||||
schlagworte: [...dokument.schlagworte],
|
||||
seedSchluessel: dokument.seedSchluessel ?? null,
|
||||
},
|
||||
}));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user