UNPKG

@adonisjs/lucid

Version:

SQL ORM built on top of Active Record pattern

190 lines (189 loc) 5.63 kB
/* * @adonisjs/lucid * * (c) Harminder Virk <virk@adonisjs.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ import { dateColumn } from './date.js'; import { dateTimeColumn } from './date_time.js'; /** * Define property on a model as a column. The decorator needs a * proper model class inheriting the base model */ export const column = (options) => { return function decorateAsColumn(target, property) { const Model = target.constructor; Model.boot(); Model.$addColumn(property, options || {}); }; }; column.date = dateColumn; column.dateTime = dateTimeColumn; /** * Define computed property on a model. The decorator needs a * proper model class inheriting the base model */ export const computed = (options) => { return function decorateAsComputed(target, property) { const Model = target.constructor; Model.boot(); Model.$addComputed(property, options || {}); }; }; /** * Define belongsTo relationship */ export const belongsTo = (relatedModel, relation) => { return function decorateAsRelation(target, property) { const Model = target.constructor; Model.boot(); Model.$addRelation(property, 'belongsTo', relatedModel, Object.assign({ relatedModel }, relation)); }; }; /** * Define hasOne relationship */ export const hasOne = (relatedModel, relation) => { return function decorateAsRelation(target, property) { const Model = target.constructor; Model.boot(); Model.$addRelation(property, 'hasOne', relatedModel, Object.assign({ relatedModel }, relation)); }; }; /** * Define hasMany relationship */ export const hasMany = (relatedModel, relation) => { return function decorateAsRelation(target, property) { const Model = target.constructor; Model.boot(); Model.$addRelation(property, 'hasMany', relatedModel, Object.assign({ relatedModel }, relation)); }; }; /** * Define manyToMany relationship */ export const manyToMany = (relatedModel, relation) => { return function decorateAsRelation(target, property) { const Model = target.constructor; Model.boot(); Model.$addRelation(property, 'manyToMany', relatedModel, Object.assign({ relatedModel }, relation)); }; }; /** * Define hasManyThrough relationship */ export const hasManyThrough = ([relatedModel, throughModel], relation) => { return function decorateAsRelation(target, property) { const Model = target.constructor; Model.boot(); Model.$addRelation(property, 'hasManyThrough', relatedModel, Object.assign({ relatedModel, throughModel }, relation)); }; }; /** * Before/After save hook */ export const beforeSave = () => { return function decorateAsHook(target, property) { target.boot(); target.before('save', target[property].bind(target)); }; }; export const afterSave = () => { return function decorateAsColumn(target, property) { target.boot(); target.after('save', target[property].bind(target)); }; }; /** * Before/After create hook */ export const beforeCreate = () => { return function decorateAsColumn(target, property) { target.boot(); target.before('create', target[property].bind(target)); }; }; export const afterCreate = () => { return function decorateAsColumn(target, property) { target.boot(); target.after('create', target[property].bind(target)); }; }; /** * Before/After update hook */ export const beforeUpdate = () => { return function decorateAsColumn(target, property) { target.boot(); target.before('update', target[property].bind(target)); }; }; export const afterUpdate = () => { return function decorateAsColumn(target, property) { target.boot(); target.after('update', target[property].bind(target)); }; }; /** * Before/After delete hook */ export const beforeDelete = () => { return function decorateAsColumn(target, property) { target.boot(); target.before('delete', target[property].bind(target)); }; }; export const afterDelete = () => { return function decorateAsColumn(target, property) { target.boot(); target.after('delete', target[property].bind(target)); }; }; /** * Before/After find hook */ export const beforeFind = () => { return function decorateAsColumn(target, property) { target.boot(); target.before('find', target[property].bind(target)); }; }; export const afterFind = () => { return function decorateAsColumn(target, property) { target.boot(); target.after('find', target[property].bind(target)); }; }; /** * Before/After fetchs hook */ export const beforeFetch = () => { return function decorateAsColumn(target, property) { target.boot(); target.before('fetch', target[property].bind(target)); }; }; export const afterFetch = () => { return function decorateAsColumn(target, property) { target.boot(); target.after('fetch', target[property].bind(target)); }; }; /** * Before/After paginate hook */ export const beforePaginate = () => { return function decorateAsColumn(target, property) { target.boot(); target.before('paginate', target[property].bind(target)); }; }; export const afterPaginate = () => { return function decorateAsColumn(target, property) { target.boot(); target.after('paginate', target[property].bind(target)); }; };