UNPKG

@directus/api

Version:

Directus is a real-time API and App dashboard for managing SQL database content

55 lines (53 loc) 2.15 kB
import { set } from "lodash-es"; import { randomUUID } from "node:crypto"; //#region src/database/migrations/20230526A-migrate-translation-strings.ts function transformStringsNewFormat(oldStrings) { return oldStrings.reduce((result, item) => { if (!item.key || !item.translations) return result; for (const [language, value] of Object.entries(item.translations)) result.push({ id: randomUUID(), key: item.key, language, value }); return result; }, []); } function transformStringsOldFormat(newStrings) { const keyCache = {}; for (const { key, language, value } of newStrings) set(keyCache, [key, language], value); return Object.entries(keyCache).map(([key, translations]) => ({ key, translations })); } async function up(knex) { await knex.schema.createTable("directus_translations", (table) => { table.uuid("id").primary().notNullable(); table.string("language").notNullable(); table.string("key").notNullable(); table.text("value").notNullable(); }); const data = await knex.select("translation_strings", "id").from("directus_settings").first(); if (data?.translation_strings && data?.id) { const newTranslationStrings = transformStringsNewFormat(typeof data.translation_strings === "string" ? JSON.parse(data.translation_strings) : data.translation_strings); for (const item of newTranslationStrings) await knex("directus_translations").insert(item); } await knex.schema.alterTable("directus_settings", (table) => { table.dropColumn("translation_strings"); }); } async function down(knex) { const data = await knex.select("language", "key", "value").from("directus_translations"); const settingsId = await knex.select("id").from("directus_settings").first(); await knex.schema.alterTable("directus_settings", (table) => { table.json("translation_strings"); }); if (settingsId?.id && data) { const oldTranslationStrings = transformStringsOldFormat(data); await knex("directus_settings").where({ id: settingsId.id }).update({ translation_strings: JSON.stringify(oldTranslationStrings) }); } await knex.schema.dropTable("directus_translations"); } //#endregion export { down, up };