export const id = '20261005-app-catalog';
export const name = 'App-Katalog: die App-Ebene des Vertrags (Environment, Vorgaben)';
/**
* Die App-Ebene des Backend-Vertrags (YAML) bekommt eine eigene Tabelle.
*
* ## Warum eine zweite Tabelle und nicht eine Spalte mehr in `AppBackendBranch`
*
* `AppBackendBranch` ist pro **Zweig** geschlüsselt (`(AppKey, Branch)`) — seine
* Zeilen tragen Werte, die sich je Zweig unterscheiden (`api`, `baseUrl`). Das
* Frontend-`environment` und die Anzeige-Vorgaben (`title`, `icon`, `roles`,
* `domain`) gelten dagegen **pro App**. Läge die App-Ebene in derselben Tabelle,
* stünde sie in jeder Zweig-Zeile noch einmal — und zwei Zeilen könnten sich
* widersprechen, ohne dass eine davon „falsch" wäre. Ein App-Schlüssel, ein
* Ort.
*
* ## Vorgabe, nicht Wahrheit
*
* Was hier steht, ist das **Angebot** aus dem Vertrag. Sobald ein Org-Admin ein
* Feld im Frontend ändert, liegt die Überschreibung am App-Objekt
* (`ObjectBase`, `Data`) und gewinnt beim Lesen. Der Import schreibt deshalb
* **nie** in `ObjectBase`: ein Re-Import darf keine Admin-Entscheidung
* zurücksetzen. `Data` ist ein JSON-Objekt (`environment`, `title`, `icon`,
* `roles`, `domain`) und wird als Ganzes gelesen — die Felder sind wenige und
* werden nie einzeln abgefragt.
*
* ## Kein Fremdschlüssel
*
* Wie überall in diesem Schema: die Beziehung zu `AppBackendBranch` und
* `OrgAppDeployment` ist fachlich (gleicher `AppKey`), nicht als FK deklariert.
*
* Wie bei den Registry-Typen liegt die Struktur auch in `initTables.sql`, damit
* frische Installationen nicht auf die Migration warten müssen.
*
* @see PLAN.md §6.9 — Backends sind ein eigener Vertrag und eine Admin-Wahl
*/
const CREATE_APP_CATALOG = `
CREATE TABLE IF NOT EXISTS \`AppCatalog\` (
\`AppKey\` VARCHAR(64) NOT NULL,
\`Data\` JSON NOT NULL,
\`UpdatedAt\` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (\`AppKey\`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
`;
export const migrate = async ({ query }) => {
await query(CREATE_APP_CATALOG, []);
};