diff --git a/README.md b/README.md index 6f3336d..4e1580b 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,14 @@ import express from 'express' import Plugin from '@adminjs/express' import Adapter, { Database, Resource } from '@adminjs/sql' +Resource.validate = async (tableName, params)=> { + // ...code + if(errors.length > 0){ + return errors + } + return [] +} + AdminJS.registerAdapter({ Database, Resource, diff --git a/src/Resource.ts b/src/Resource.ts index e6f2bec..a07ab72 100644 --- a/src/Resource.ts +++ b/src/Resource.ts @@ -4,6 +4,7 @@ import { Filter, ParamsType, SupportedDatabasesType, + ValidationError, } from 'adminjs'; import type { Knex } from 'knex'; @@ -22,6 +23,8 @@ export class Resource extends BaseResource { return r; } + public static validate: any; + private knex: Knex; private dialect: DatabaseDialect; @@ -127,6 +130,9 @@ export class Resource extends BaseResource { const knex = this.schemaName ? this.knex(this.tableName).withSchema(this.schemaName) : this.knex(this.tableName); + + await Resource.validateObject(this.tableName, params); + await knex.insert(params); return params; @@ -140,6 +146,8 @@ export class Resource extends BaseResource { ? this.knex.withSchema(this.schemaName) : this.knex; + await Resource.validateObject(this.tableName, params); + await knex.from(this.tableName).update(params).where(this.idColumn, id); const knexQb = this.schemaName @@ -187,4 +195,23 @@ export class Resource extends BaseResource { return q; } + + static async validateObject(tableName: string, object: Record): Promise { + if (Resource.validate) { + const errors = await Resource.validate(tableName, object); + if (errors && errors.length) { + const validationErrors = errors.reduce( + (memo, error) => ({ + ...memo, + [error.property]: { + type: Object.keys(error.constraints)[0], + message: Object.values(error.constraints)[0], + }, + }), + {}, + ); + throw new ValidationError(validationErrors); + } + } + } }