Source: config/migrations/20261005-app-catalog.js

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, []);
};