Skip to content

Commit

Permalink
Merge pull request #366 from formidablejs/feature/async-validator
Browse files Browse the repository at this point in the history
Feature/async validator
  • Loading branch information
donaldp authored Feb 22, 2025
2 parents 240f590 + 722a270 commit bd2228d
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 7 deletions.
8 changes: 5 additions & 3 deletions src/Support/Decorators/tsUse.imba
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export const use = do(...paramaters)

config.request = request

definition.forEach do(object, key)
for own key, object of definition
let response = null

if isString(object) && object.substring(0, 'table:'.length) === 'table:'
Expand Down Expand Up @@ -115,8 +115,10 @@ export const use = do(...paramaters)

const validator = response.validate!

if (validator.fails!)
throw ValidationException.withMessages(validator.errors.errors)
await new Promise do(resolve, reject)
validator.checkAsync
do resolve!
do reject(ValidationException.withMessages(validator.errors.errors))

if response.hasHeader('X-FORMIDABLE-VALIDATE')
die do
Expand Down
8 changes: 5 additions & 3 deletions src/Support/Decorators/use.imba
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def use target, key, descriptor

config.request = request

await definition.forEach do(object, key)
for own key, object of definition
let response = null

if isString(object) && object.substring(0, 'table:'.length) === 'table:'
Expand Down Expand Up @@ -114,8 +114,10 @@ def use target, key, descriptor

const validator = response.validate!

if (validator.fails!)
throw ValidationException.withMessages(validator.errors.errors)
await new Promise do(resolve, reject)
validator.checkAsync
do resolve!
do reject(ValidationException.withMessages(validator.errors.errors))

if response.hasHeader('X-FORMIDABLE-VALIDATE')
die do
Expand Down
43 changes: 42 additions & 1 deletion src/Validator/ValidationServiceResolver.imba
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import DB from '../Database/Database'
import ServiceResolver from '../Support/ServiceResolver'
import Validator from './Validator'

Expand All @@ -10,15 +11,55 @@ export default class ValidationServiceResolver < ServiceResolver

def register
Validator.get!.register 'nullable', self.nullable, ''
Validator.get!.registerAsync 'unique', self.unique
Validator.get!.registerAsync 'exists', self.exists

def nullable
true

def unique value\string, definition\string, field\string, passes\CallableFunction
let [
table,
column = field,
ignore = null
] = definition.split(',')

let results

if ignore
const [
identifierValue,
identifierColumn = 'id'
] = ignore.split(':')

results = await DB.table(table)
.whereRaw("LOWER({column}) = LOWER(?) AND {identifierColumn} != ?", [ value, identifierValue ])
.first!
else
results = await DB.table(table)
.whereRaw("LOWER({column}) = LOWER(?)", [ value ])
.first!

passes(!results, "The {field} has already been taken.")

def exists value\string, definition\string, field\string, passes\CallableFunction
let [
table,
column = field,
ignore = null
] = definition.split(',')

const results = await DB.table(table)
.whereRaw("LOWER({field}) = LOWER(?)", [value])
.first()

passes(results ? true : false, "The selected {field} is invalid.")

def registeredRules
{ }

def registerRules rules\object
Object.keys(rules).forEach do(name)
Validator.get!.registerAsync(name, rules[name].handler)
Validator.get!.registerAsync(name, rules[name])

this

0 comments on commit bd2228d

Please sign in to comment.