WIP - use objection for record shares

This commit is contained in:
Francisco Gaona
2025-12-30 21:46:37 +01:00
parent c50098a55c
commit 75b7325cea
2 changed files with 19 additions and 23 deletions

View File

@@ -21,13 +21,13 @@ export class RecordShare extends BaseModel {
}; };
} }
// Override BaseModel hooks to prevent automatic timestamp handling // Don't auto-set timestamps - let DB defaults handle them
$beforeInsert(queryContext: any) { $beforeInsert() {
// Don't set timestamps - let database defaults handle it // Don't call super - skip BaseModel's timestamp logic
} }
$beforeUpdate(opt: any, queryContext: any) { $beforeUpdate() {
// Don't set timestamps - let database defaults handle it // Don't call super - skip BaseModel's timestamp logic
} }
id!: string; id!: string;

View File

@@ -147,39 +147,37 @@ export class RecordSharingController {
if (existingShare) { if (existingShare) {
// Update existing share // Update existing share
await knex('record_shares') const updated = await RecordShare.query(knex)
.where({ id: existingShare.id }) .patchAndFetchById(existingShare.id, {
.update({ accessLevel: {
accessLevel: JSON.stringify({
canRead: data.canRead, canRead: data.canRead,
canEdit: data.canEdit, canEdit: data.canEdit,
canDelete: data.canDelete, canDelete: data.canDelete,
}), },
expiresAt: data.expiresAt ? data.expiresAt : null, expiresAt: data.expiresAt || null,
updatedAt: knex.fn.now(),
}); });
return RecordShare.query(knex) return RecordShare.query(knex)
.findById(existingShare.id) .findById(updated.id)
.withGraphFetched('[granteeUser]'); .withGraphFetched('[granteeUser]');
} }
// Create new share // Create new share
const [shareId] = await knex('record_shares').insert({ const share = await RecordShare.query(knex).insert({
objectDefinitionId: objectDef.id, objectDefinitionId: objectDef.id,
recordId, recordId,
granteeUserId: data.granteeUserId, granteeUserId: data.granteeUserId,
grantedByUserId: currentUser.userId, grantedByUserId: currentUser.userId,
accessLevel: JSON.stringify({ accessLevel: {
canRead: data.canRead, canRead: data.canRead,
canEdit: data.canEdit, canEdit: data.canEdit,
canDelete: data.canDelete, canDelete: data.canDelete,
}), },
expiresAt: data.expiresAt ? data.expiresAt : null, expiresAt: data.expiresAt || null,
}); });
return RecordShare.query(knex) return RecordShare.query(knex)
.findById(shareId) .findById(share.id)
.withGraphFetched('[granteeUser]'); .withGraphFetched('[granteeUser]');
} }
@@ -235,11 +233,9 @@ export class RecordSharingController {
} }
// Revoke the share (soft delete) // Revoke the share (soft delete)
await knex('record_shares') await RecordShare.query(knex)
.where({ id: shareId }) .patchAndFetchById(shareId, {
.update({ revokedAt: knex.fn.now() as any,
revokedAt: knex.fn.now(),
updatedAt: knex.fn.now(),
}); });
return { success: true }; return { success: true };