@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
61 lines (59 loc) • 2.54 kB
JavaScript
import { DatabaseClients } from "../../packages/types/dist/index.js";
import { ALIAS_TYPES, SNAPSHOT_VERSION } from "../../constants.js";
import { getDatabaseClient } from "../../database/index.js";
import { InvalidPayloadError } from "@directus/errors";
import { TYPES } from "@directus/constants";
import Joi from "joi";
import { version } from "directus/version";
//#region src/utils/schema/validate-snapshot.ts
const snapshotJoiSchema = Joi.object({
version: Joi.number().valid(...Object.values(SNAPSHOT_VERSION)).required(),
directus: Joi.string().required(),
vendor: Joi.string().valid(...DatabaseClients).optional(),
collections: Joi.array().items(Joi.object({
collection: Joi.string(),
meta: Joi.any(),
schema: Joi.object({ name: Joi.string() })
})),
fields: Joi.array().items(Joi.object({
collection: Joi.string(),
field: Joi.string(),
meta: Joi.any(),
schema: Joi.object({
default_value: Joi.any(),
max_length: [
Joi.number(),
Joi.string(),
Joi.valid(null)
],
is_nullable: Joi.bool()
}).unknown().allow(null),
type: Joi.string().valid(...TYPES, ...ALIAS_TYPES).allow(null)
})),
systemFields: Joi.array().items(Joi.object({
collection: Joi.string(),
field: Joi.string(),
schema: Joi.object({ is_indexed: Joi.bool() })
})),
relations: Joi.array().items(Joi.object({
collection: Joi.string(),
field: Joi.string(),
meta: Joi.any(),
related_collection: Joi.any(),
schema: Joi.any()
}))
});
/**
* Validates the snapshot against the current instance.
**/
function validateSnapshot(snapshot, force = false) {
const { error } = snapshotJoiSchema.validate(snapshot);
if (error) throw new InvalidPayloadError({ reason: error.message });
if (force) return;
if (snapshot.directus !== version) throw new InvalidPayloadError({ reason: `Provided snapshot's directus version ${snapshot.directus} does not match the current instance's version ${version}. You can bypass this check by passing the "force" query parameter` });
if (!snapshot.vendor) throw new InvalidPayloadError({ reason: "Provided snapshot does not contain the \"vendor\" property. You can bypass this check by passing the \"force\" query parameter" });
const currentVendor = getDatabaseClient();
if (snapshot.vendor !== currentVendor) throw new InvalidPayloadError({ reason: `Provided snapshot's vendor ${snapshot.vendor} does not match the current instance's vendor ${currentVendor}. You can bypass this check by passing the "force" query parameter` });
}
//#endregion
export { validateSnapshot };