@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
73 lines (71 loc) • 3.07 kB
JavaScript
import { parseJSON } from "@directus/utils";
//#region src/database/migrations/20211007A-update-presets.ts
async function up(knex) {
await knex.schema.alterTable("directus_presets", (table) => {
table.json("filter");
});
const presets = await knex.select("id", "filters", "layout_query").from("directus_presets");
for (const preset of presets) {
if (preset.filters) {
const oldFilters = (typeof preset.filters === "string" ? parseJSON(preset.filters) : preset.filters) ?? [];
if (oldFilters.length === 0) continue;
const newFilter = { _and: [] };
for (const oldFilter of oldFilters) {
if (oldFilter.key === "hide-archived") continue;
newFilter._and.push({ [oldFilter.field]: { ["_" + oldFilter.operator]: oldFilter.value } });
}
if (newFilter._and.length > 0) await knex("directus_presets").update({ filter: JSON.stringify(newFilter) }).where("id", "=", preset.id);
}
if (preset.layout_query) {
const layoutQuery = typeof preset.layout_query === "string" ? parseJSON(preset.layout_query) : preset.layout_query;
for (const [layout, query] of Object.entries(layoutQuery)) {
if (query.sort) query.sort = [query.sort];
layoutQuery[layout] = query;
}
await knex("directus_presets").update({ layout_query: JSON.stringify(layoutQuery) }).where("id", "=", preset.id);
}
}
await knex.schema.alterTable("directus_presets", (table) => {
table.dropColumn("filters");
});
}
async function down(knex) {
const { nanoid } = await import("nanoid");
await knex.schema.alterTable("directus_presets", (table) => {
table.json("filters");
});
const presets = await knex.select("id", "filter", "layout_query").from("directus_presets");
for (const preset of presets) {
if (preset.filter) {
const newFilter = (typeof preset.filter === "string" ? parseJSON(preset.filter) : preset.filter) ?? {};
if (Object.keys(newFilter).length === 0) continue;
const oldFilters = [];
for (const filter of newFilter._and ?? []) {
const field = Object.keys(filter)?.[0];
const operator = Object.keys(Object.values(filter)?.[0] ?? {})?.[0];
const value = Object.values(Object.values(filter)?.[0] ?? {})?.[0];
if (!field || !operator || !value) continue;
oldFilters.push({
key: nanoid(),
field,
operator: operator.substring(1),
value
});
}
if (oldFilters.length > 0) await knex("directus_presets").update({ filters: JSON.stringify(oldFilters) }).where("id", "=", preset.id);
}
if (preset.layout_query) {
const layoutQuery = typeof preset.layout_query === "string" ? parseJSON(preset.layout_query) : preset.layout_query;
for (const [layout, query] of Object.entries(layoutQuery)) {
if (query.sort && Array.isArray(query.sort)) query.sort = query.sort?.[0] ?? null;
layoutQuery[layout] = query;
}
await knex("directus_presets").update({ layout_query: JSON.stringify(layoutQuery) }).where("id", "=", preset.id);
}
}
await knex.schema.alterTable("directus_presets", (table) => {
table.dropColumn("filter");
});
}
//#endregion
export { down, up };