diff --git a/backend/src/models/record-share.model.ts b/backend/src/models/record-share.model.ts index c61d7f6..24837fb 100644 --- a/backend/src/models/record-share.model.ts +++ b/backend/src/models/record-share.model.ts @@ -21,13 +21,13 @@ export class RecordShare extends BaseModel { }; } - // Override BaseModel hooks to prevent automatic timestamp handling - $beforeInsert(queryContext: any) { - // Don't set timestamps - let database defaults handle it + // Don't auto-set timestamps - let DB defaults handle them + $beforeInsert() { + // Don't call super - skip BaseModel's timestamp logic } - $beforeUpdate(opt: any, queryContext: any) { - // Don't set timestamps - let database defaults handle it + $beforeUpdate() { + // Don't call super - skip BaseModel's timestamp logic } id!: string; diff --git a/backend/src/rbac/record-sharing.controller.ts b/backend/src/rbac/record-sharing.controller.ts index e67726d..8df345d 100644 --- a/backend/src/rbac/record-sharing.controller.ts +++ b/backend/src/rbac/record-sharing.controller.ts @@ -147,39 +147,37 @@ export class RecordSharingController { if (existingShare) { // Update existing share - await knex('record_shares') - .where({ id: existingShare.id }) - .update({ - accessLevel: JSON.stringify({ + const updated = await RecordShare.query(knex) + .patchAndFetchById(existingShare.id, { + accessLevel: { canRead: data.canRead, canEdit: data.canEdit, canDelete: data.canDelete, - }), - expiresAt: data.expiresAt ? data.expiresAt : null, - updatedAt: knex.fn.now(), + }, + expiresAt: data.expiresAt || null, }); return RecordShare.query(knex) - .findById(existingShare.id) + .findById(updated.id) .withGraphFetched('[granteeUser]'); } // Create new share - const [shareId] = await knex('record_shares').insert({ + const share = await RecordShare.query(knex).insert({ objectDefinitionId: objectDef.id, recordId, granteeUserId: data.granteeUserId, grantedByUserId: currentUser.userId, - accessLevel: JSON.stringify({ + accessLevel: { canRead: data.canRead, canEdit: data.canEdit, canDelete: data.canDelete, - }), - expiresAt: data.expiresAt ? data.expiresAt : null, + }, + expiresAt: data.expiresAt || null, }); return RecordShare.query(knex) - .findById(shareId) + .findById(share.id) .withGraphFetched('[granteeUser]'); } @@ -235,11 +233,9 @@ export class RecordSharingController { } // Revoke the share (soft delete) - await knex('record_shares') - .where({ id: shareId }) - .update({ - revokedAt: knex.fn.now(), - updatedAt: knex.fn.now(), + await RecordShare.query(knex) + .patchAndFetchById(shareId, { + revokedAt: knex.fn.now() as any, }); return { success: true };