directus

Форк
0
/
20211007A-update-presets.ts 
143 строки · 3.6 Кб
1
import type { Filter, LogicalFilterAND } from '@directus/types';
2
import { parseJSON } from '@directus/utils';
3
import type { Knex } from 'knex';
4

5
type OldFilter = {
6
	key: string;
7
	field: string;
8
	value: any;
9
	operator: string;
10
};
11

12
export async function up(knex: Knex): Promise<void> {
13
	await knex.schema.alterTable('directus_presets', (table) => {
14
		table.json('filter');
15
	});
16

17
	const presets = await knex
18
		.select<{ id: number; filters: string | OldFilter[]; layout_query: string | Record<string, any> }[]>(
19
			'id',
20
			'filters',
21
			'layout_query',
22
		)
23
		.from('directus_presets');
24

25
	for (const preset of presets) {
26
		if (preset.filters) {
27
			const oldFilters: OldFilter[] =
28
				(typeof preset.filters === 'string' ? parseJSON(preset.filters) : preset.filters) ?? [];
29

30
			if (oldFilters.length === 0) continue;
31

32
			const newFilter: Filter = {
33
				_and: [],
34
			};
35

36
			for (const oldFilter of oldFilters) {
37
				if (oldFilter.key === 'hide-archived') continue;
38

39
				newFilter._and.push({
40
					[oldFilter.field]: {
41
						['_' + oldFilter.operator]: oldFilter.value,
42
					},
43
				});
44
			}
45

46
			if (newFilter._and.length > 0) {
47
				await knex('directus_presets')
48
					.update({ filter: JSON.stringify(newFilter) })
49
					.where('id', '=', preset.id);
50
			}
51
		}
52

53
		if (preset.layout_query) {
54
			const layoutQuery: Record<string, any> =
55
				typeof preset.layout_query === 'string' ? parseJSON(preset.layout_query) : preset.layout_query;
56

57
			for (const [layout, query] of Object.entries(layoutQuery)) {
58
				if (query.sort) {
59
					query.sort = [query.sort];
60
				}
61

62
				layoutQuery[layout] = query;
63
			}
64

65
			await knex('directus_presets')
66
				.update({ layout_query: JSON.stringify(layoutQuery) })
67
				.where('id', '=', preset.id);
68
		}
69
	}
70

71
	await knex.schema.alterTable('directus_presets', (table) => {
72
		table.dropColumn('filters');
73
	});
74
}
75

76
export async function down(knex: Knex): Promise<void> {
77
	const { nanoid } = await import('nanoid');
78

79
	await knex.schema.alterTable('directus_presets', (table) => {
80
		table.json('filters');
81
	});
82

83
	const presets = await knex
84
		.select<{ id: number; filter: string | OldFilter[]; layout_query: string | Record<string, any> }[]>(
85
			'id',
86
			'filter',
87
			'layout_query',
88
		)
89
		.from('directus_presets');
90

91
	for (const preset of presets) {
92
		if (preset.filter) {
93
			const newFilter: LogicalFilterAND =
94
				(typeof preset.filter === 'string' ? parseJSON(preset.filter) : preset.filter) ?? {};
95

96
			if (Object.keys(newFilter).length === 0) continue;
97

98
			const oldFilters: OldFilter[] = [];
99

100
			for (const filter of newFilter._and ?? []) {
101
				const field = Object.keys(filter)?.[0];
102
				const operator = Object.keys(Object.values(filter)?.[0] ?? {})?.[0];
103
				const value = Object.values(Object.values(filter)?.[0] ?? {})?.[0];
104

105
				if (!field || !operator || !value) continue;
106

107
				oldFilters.push({
108
					key: nanoid(),
109
					field,
110
					operator: operator.substring(1),
111
					value,
112
				});
113
			}
114

115
			if (oldFilters.length > 0) {
116
				await knex('directus_presets')
117
					.update({ filters: JSON.stringify(oldFilters) })
118
					.where('id', '=', preset.id);
119
			}
120
		}
121

122
		if (preset.layout_query) {
123
			const layoutQuery: Record<string, any> =
124
				typeof preset.layout_query === 'string' ? parseJSON(preset.layout_query) : preset.layout_query;
125

126
			for (const [layout, query] of Object.entries(layoutQuery)) {
127
				if (query.sort && Array.isArray(query.sort)) {
128
					query.sort = query.sort?.[0] ?? null;
129
				}
130

131
				layoutQuery[layout] = query;
132
			}
133

134
			await knex('directus_presets')
135
				.update({ layout_query: JSON.stringify(layoutQuery) })
136
				.where('id', '=', preset.id);
137
		}
138
	}
139

140
	await knex.schema.alterTable('directus_presets', (table) => {
141
		table.dropColumn('filter');
142
	});
143
}
144

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

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

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

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