directus
65 строк · 1.8 Кб
1import type { Knex } from 'knex';
2import { uniq } from 'lodash-es';
3
4export async function up(knex: Knex): Promise<void> {
5const groupsInUse = await knex.select('id', 'group').from('directus_fields').whereNotNull('group');
6
7const groupIDs: number[] = uniq(groupsInUse.map(({ group }) => group));
8
9const groupFields = await knex.select('id', 'field').from('directus_fields').whereIn('id', groupIDs);
10
11const groupMap = new Map();
12
13for (const { id, field } of groupFields) {
14groupMap.set(id, field);
15}
16
17await knex.schema.alterTable('directus_fields', (table) => {
18table.dropForeign('group');
19});
20
21await knex.schema.alterTable('directus_fields', (table) => {
22table.dropColumn('group');
23});
24
25await knex.schema.alterTable('directus_fields', (table) => {
26table.string('group', 64);
27});
28
29for (const { id, group } of groupsInUse) {
30await knex('directus_fields')
31.update({ group: groupMap.get(group) })
32.where({ id });
33}
34}
35
36export async function down(knex: Knex): Promise<void> {
37const fieldsThatUseAGroup = await knex
38.select('id', 'collection', 'group')
39.from('directus_fields')
40.whereNotNull('group');
41
42if (fieldsThatUseAGroup.length === 0) return;
43
44const groupMap = new Map();
45
46for (const { collection, group } of fieldsThatUseAGroup) {
47const { id } = await knex.select('id').from('directus_fields').where({ collection, field: group }).first();
48
49groupMap.set(group, id);
50}
51
52await knex.schema.alterTable('directus_fields', (table) => {
53table.dropColumn('group');
54});
55
56await knex.schema.alterTable('directus_fields', (table) => {
57table.integer('group').references('id').inTable('directus_fields');
58});
59
60for (const { id, group } of fieldsThatUseAGroup) {
61await knex('directus_fields')
62.update({ group: groupMap.get(group) })
63.where({ id });
64}
65}
66