UNPKG

@directus/api

Version:

Directus is a real-time API and App dashboard for managing SQL database content

61 lines (59 loc) 2.54 kB
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 };