@adonisjs/lucid
Version:
SQL ORM built on top of Active Record pattern
190 lines (189 loc) • 5.63 kB
JavaScript
/*
* @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));
};
};