64 lines
1.9 KiB
TypeScript
64 lines
1.9 KiB
TypeScript
|
/*
|
||
|
|--------------------------------------------------------------------------
|
||
|
| Preloaded File - node ace make:preload rules/uniquePerson
|
||
|
|--------------------------------------------------------------------------
|
||
|
|*/
|
||
|
|
||
|
import { FieldContext } from '@vinejs/vine/types';
|
||
|
import db from '@adonisjs/lucid/services/db';
|
||
|
import vine from '@vinejs/vine';
|
||
|
import { VineString, VineNumber } from '@vinejs/vine';
|
||
|
|
||
|
/**
|
||
|
* Options accepted by the unique rule
|
||
|
*/
|
||
|
type Options = {
|
||
|
table: string;
|
||
|
column: string;
|
||
|
// whereNot?: ((field: FieldContext) => string);
|
||
|
idField: string;
|
||
|
};
|
||
|
|
||
|
|
||
|
async function isUniquePerson(value: unknown, options: Options, field: FieldContext) {
|
||
|
if (typeof value !== 'string' && typeof value != 'number') {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// let ignoreId: string | undefined;
|
||
|
// if (options.whereNot) {
|
||
|
// ignoreId = options.whereNot(field);
|
||
|
// }
|
||
|
const idValue = vine.helpers.getNestedValue(options.idField, field); //'Main' or 'Translated'
|
||
|
|
||
|
const builder = db.from(options.table).select(options.column).where(options.column, value);
|
||
|
// if existent id, exclide it from validating
|
||
|
if (idValue) {
|
||
|
builder.whereNot('id', '=', idValue);
|
||
|
}
|
||
|
const result = await builder.first();
|
||
|
if (result) {
|
||
|
// report that value is NOT unique
|
||
|
field.report('The {{ field }} field is not unique', 'isUnique', field);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export const isUniquePersonRule = vine.createRule(isUniquePerson);
|
||
|
|
||
|
|
||
|
declare module '@vinejs/vine' {
|
||
|
interface VineString {
|
||
|
isUniquePerson(options: Options): this;
|
||
|
}
|
||
|
interface VineNumber {
|
||
|
isUniquePerson(options: Options): this;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
VineString.macro('isUniquePerson', function (this: VineString, options: Options) {
|
||
|
return this.use(isUniquePersonRule(options));
|
||
|
});
|
||
|
VineNumber.macro('isUniquePerson', function (this: VineNumber, options: Options) {
|
||
|
return this.use(isUniquePersonRule(options));
|
||
|
});
|