directus

Форк
0
/
20230526A-migrate-translation-strings.ts 
84 строки · 2.6 Кб
1
import type { Knex } from 'knex';
2
import { set } from 'lodash-es';
3
import { randomUUID } from 'node:crypto';
4

5
type NewTranslationString = {
6
	id: string;
7
	key: string;
8
	value: string;
9
	language: string;
10
};
11

12
type OldTranslationString = {
13
	key?: string | null;
14
	translations?: Record<string, string> | null;
15
};
16

17
function transformStringsNewFormat(oldStrings: OldTranslationString[]): NewTranslationString[] {
18
	return oldStrings.reduce<NewTranslationString[]>((result, item) => {
19
		if (!item.key || !item.translations) return result;
20

21
		for (const [language, value] of Object.entries(item.translations)) {
22
			result.push({ id: randomUUID(), key: item.key, language, value });
23
		}
24

25
		return result;
26
	}, []);
27
}
28

29
function transformStringsOldFormat(newStrings: NewTranslationString[]): OldTranslationString[] {
30
	const keyCache: Record<string, Record<string, string>> = {};
31

32
	for (const { key, language, value } of newStrings) {
33
		set(keyCache, [key, language], value);
34
	}
35

36
	return Object.entries(keyCache).map(([key, translations]) => ({ key, translations }) as OldTranslationString);
37
}
38

39
export async function up(knex: Knex): Promise<void> {
40
	await knex.schema.createTable('directus_translations', (table) => {
41
		table.uuid('id').primary().notNullable();
42
		table.string('language').notNullable();
43
		table.string('key').notNullable();
44
		table.text('value').notNullable();
45
	});
46

47
	const data = await knex.select('translation_strings', 'id').from('directus_settings').first();
48

49
	if (data?.translation_strings && data?.id) {
50
		const parsedTranslationStrings =
51
			typeof data.translation_strings === 'string' ? JSON.parse(data.translation_strings) : data.translation_strings;
52

53
		const newTranslationStrings = transformStringsNewFormat(parsedTranslationStrings);
54

55
		for (const item of newTranslationStrings) {
56
			await knex('directus_translations').insert(item);
57
		}
58
	}
59

60
	await knex.schema.alterTable('directus_settings', (table) => {
61
		table.dropColumn('translation_strings');
62
	});
63
}
64

65
export async function down(knex: Knex): Promise<void> {
66
	const data = await knex.select('language', 'key', 'value').from('directus_translations');
67
	const settingsId = await knex.select('id').from('directus_settings').first();
68

69
	await knex.schema.alterTable('directus_settings', (table) => {
70
		table.json('translation_strings');
71
	});
72

73
	if (settingsId?.id && data) {
74
		const oldTranslationStrings = transformStringsOldFormat(data);
75

76
		await knex('directus_settings')
77
			.where({ id: settingsId.id })
78
			.update({
79
				translation_strings: JSON.stringify(oldTranslationStrings),
80
			});
81
	}
82

83
	await knex.schema.dropTable('directus_translations');
84
}
85

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.