From 43cae4289b3695dc8355ae3741ce5fc3e3f03320 Mon Sep 17 00:00:00 2001 From: Francisco Gaona Date: Thu, 8 Jan 2026 23:56:48 +0100 Subject: [PATCH] WIP - add owner to contact --- .../20250311000002_add_owner_to_contacts.js | 62 +++++++++++++++++++ backend/src/models/contact.model.ts | 9 +++ 2 files changed, 71 insertions(+) create mode 100644 backend/migrations/tenant/20250311000002_add_owner_to_contacts.js diff --git a/backend/migrations/tenant/20250311000002_add_owner_to_contacts.js b/backend/migrations/tenant/20250311000002_add_owner_to_contacts.js new file mode 100644 index 0000000..cf45d12 --- /dev/null +++ b/backend/migrations/tenant/20250311000002_add_owner_to_contacts.js @@ -0,0 +1,62 @@ +exports.up = async function (knex) { + // Add ownerId column to contacts + await knex.schema.alterTable('contacts', (table) => { + table.uuid('ownerId'); + table + .foreign('ownerId') + .references('id') + .inTable('users') + .onDelete('SET NULL'); + table.index(['ownerId']); + }); + + // Add ownerId field definition metadata for Contact object + const contactObject = await knex('object_definitions') + .where('apiName', 'Contact') + .first(); + + if (contactObject) { + const existingField = await knex('field_definitions') + .where({ + objectDefinitionId: contactObject.id, + apiName: 'ownerId', + }) + .first(); + + if (!existingField) { + await knex('field_definitions').insert({ + id: knex.raw('(UUID())'), + objectDefinitionId: contactObject.id, + apiName: 'ownerId', + label: 'Owner', + type: 'Reference', + referenceObject: 'User', + isSystem: true, + isCustom: false, + displayOrder: 4, + created_at: knex.fn.now(), + updated_at: knex.fn.now(), + }); + } + } +}; + +exports.down = async function (knex) { + const contactObject = await knex('object_definitions') + .where('apiName', 'Contact') + .first(); + + if (contactObject) { + await knex('field_definitions') + .where({ + objectDefinitionId: contactObject.id, + apiName: 'ownerId', + }) + .delete(); + } + + await knex.schema.alterTable('contacts', (table) => { + table.dropForeign(['ownerId']); + table.dropColumn('ownerId'); + }); +}; diff --git a/backend/src/models/contact.model.ts b/backend/src/models/contact.model.ts index 285c4dc..3dfc9e4 100644 --- a/backend/src/models/contact.model.ts +++ b/backend/src/models/contact.model.ts @@ -7,6 +7,7 @@ export class Contact extends BaseModel { firstName!: string; lastName!: string; accountId!: string; + ownerId?: string; static relationMappings = { account: { @@ -17,5 +18,13 @@ export class Contact extends BaseModel { to: 'accounts.id', }, }, + owner: { + relation: BaseModel.BelongsToOneRelation, + modelClass: 'user.model', + join: { + from: 'contacts.ownerId', + to: 'users.id', + }, + }, }; }