From 804c689102935fb8838a2e73814f7ca197727de2 Mon Sep 17 00:00:00 2001 From: Joel Mukuthu Date: Tue, 15 May 2018 00:05:22 +0200 Subject: [PATCH] wip: refactor: configs [skip ci] --- lib/KnormRelations.js | 14 ++-- test/KnormRelations.spec.js | 151 ++++++++++++++++++++++++++++++++---- 2 files changed, 142 insertions(+), 23 deletions(-) diff --git a/lib/KnormRelations.js b/lib/KnormRelations.js index 1582ed3..f218979 100644 --- a/lib/KnormRelations.js +++ b/lib/KnormRelations.js @@ -11,12 +11,15 @@ class KnormRelations { class RelationsField extends Field { constructor(config = {}) { super(config); - if (config.references) { - this.references = config.references; + const { type, references } = config; + if (type === 'reference') { + this.references = references; } } } + RelationsField.types = Field.types.slice().push('reference'); + knorm.Field = knorm.Model.Field = RelationsField; } @@ -116,14 +119,11 @@ class KnormRelations { // TODO: require setting `as` when configuring references as(as) { - this.options.as = as; - return this; + return this.setOption('as', as); } on(...fields) { - this.options.on = this.options.on || []; - this.options.on.push(...fields); - return this; + return this.addOption('on', fields); } async prepareJoin(sql, options) { diff --git a/test/KnormRelations.spec.js b/test/KnormRelations.spec.js index a97569a..9e8e0c9 100644 --- a/test/KnormRelations.spec.js +++ b/test/KnormRelations.spec.js @@ -59,30 +59,148 @@ describe('KnormRelations', () => { id: { type: 'integer', primary: true, updated: false } }; - class User extends Model {} - User.table = 'user'; - User.fields = { - name: { type: 'string', required: true }, - confirmed: 'boolean' + class Message extends Model {} + Message.table = 'message'; + Message.fields = { + text: { type: 'text', required: true }, + read: { type: 'boolean', default: false }, + senderId: { + type: 'integer', + references() { + return User.fields.id; + } + }, + receiverId: { + type: 'integer', + references() { + return User.fields.id; + } + }, + sender: { + type: 'reference', + references() { + return { + field: this.fields.senderId, + options: { first: true } + }; + } + }, + receiver: { + type: 'reference', + references() { + return { + field: this.fields.receiverId, + options: { first: true } + }; + } + } }; - class ImageCategory extends Model {} - ImageCategory.table = 'image_category'; - ImageCategory.fields = { name: { type: 'string', required: true } }; + class Friends extends Model {} + Friends.table = 'friends'; + Friends.fields = { + userId: { + type: 'integer', + references() { + return User.fields.id; + } + }, + friendId: { + type: 'integer', + references() { + return User.fields.id; + } + }, + user: { + type: 'reference', + references() { + return { + field: this.fields.userId, + options: { first: true } + }; + } + }, + friend: { + type: 'reference', + references() { + return { + field: this.fields.friendId, + options: { first: true } + }; + } + } + }; class Image extends Model {} Image.table = 'image'; Image.fields = { - userId: { type: 'integer', references: User.fields.id }, - categoryId: { type: 'integer', references: ImageCategory.fields.id } + userId: { + type: 'integer', + references() { + return User.fields.id; + } + }, + categoryId: { + type: 'integer', + references() { + return ImageCategory.fields.id; + } + }, + user: { + type: 'reference', + references() { + return { + field: this.fields.userId, + options: { first: true } + }; + } + }, + category: { + type: 'reference', + references() { + return { + field: this.fields.categoryId, + options: { first: true } + }; + } + } }; - class Message extends Model {} - Message.table = 'message'; - Message.fields = { - text: { type: 'text', required: true }, - senderId: { type: 'integer', references: User.fields.id }, - receiverId: { type: 'integer', references: User.fields.id } + class User extends Model {} + User.table = 'user'; + User.fields = { + name: { type: 'string', required: true }, + confirmed: 'boolean', + messages: { + type: 'reference', + references: Message.fields.receiverId + }, + readMessages: { + type: 'reference', + references: { + field: Message.fields.receiverId, + options: { where: { read: true } } + } + }, + sentMessages: { + type: 'reference', + references: Message.fields.senderId + }, + images: { + type: 'reference', + references: Image.fields.userId + }, + friends: { + type: 'reference', + references: { field: Friends.fields.friendId, via: Friends.fields.userId } + } + }; + + class ImageCategory extends Model {} + ImageCategory.table = 'image_category'; + ImageCategory.fields = { + name: { type: 'string', required: true }, + images: { type: 'reference', references: Image.fields.categoryId } }; before(async () => { @@ -110,6 +228,7 @@ describe('KnormRelations', () => { table.increments(); table.timestamps(); table.text('text').notNullable(); + table.boolean('read').notNullable(); table .integer('sender_id') .references('id')