import { BaseModel } from './base.model'; export interface RecordShareAccessLevel { canRead: boolean; canEdit: boolean; canDelete: boolean; } export class RecordShare extends BaseModel { static tableName = 'record_shares'; // Don't use snake_case mapping since DB columns are already camelCase static get columnNameMappers() { return { parse(obj: any) { return obj; }, format(obj: any) { return obj; }, }; } // Don't auto-set timestamps - let DB defaults handle them $beforeInsert() { // Don't call super - skip BaseModel's timestamp logic } $beforeUpdate() { // Don't call super - skip BaseModel's timestamp logic } id!: string; objectDefinitionId!: string; recordId!: string; granteeUserId!: string; grantedByUserId!: string; accessLevel!: RecordShareAccessLevel; expiresAt?: Date; revokedAt?: Date; createdAt!: Date; updatedAt!: Date; static get jsonSchema() { return { type: 'object', required: ['objectDefinitionId', 'recordId', 'granteeUserId', 'grantedByUserId', 'accessLevel'], properties: { id: { type: 'string' }, objectDefinitionId: { type: 'string' }, recordId: { type: 'string' }, granteeUserId: { type: 'string' }, grantedByUserId: { type: 'string' }, accessLevel: { type: 'object', properties: { canRead: { type: 'boolean' }, canEdit: { type: 'boolean' }, canDelete: { type: 'boolean' }, }, }, expiresAt: { anyOf: [ { type: 'string', format: 'date-time' }, { type: 'null' }, { type: 'object' } // Allow Date objects ] }, revokedAt: { anyOf: [ { type: 'string', format: 'date-time' }, { type: 'null' }, { type: 'object' } // Allow Date objects ] }, createdAt: { type: ['string', 'object'], format: 'date-time' }, updatedAt: { type: ['string', 'object'], format: 'date-time' }, }, }; } static get relationMappings() { const { ObjectDefinition } = require('./object-definition.model'); const { User } = require('./user.model'); return { objectDefinition: { relation: BaseModel.BelongsToOneRelation, modelClass: ObjectDefinition, join: { from: 'record_shares.objectDefinitionId', to: 'object_definitions.id', }, }, granteeUser: { relation: BaseModel.BelongsToOneRelation, modelClass: User, join: { from: 'record_shares.granteeUserId', to: 'users.id', }, }, grantedByUser: { relation: BaseModel.BelongsToOneRelation, modelClass: User, join: { from: 'record_shares.grantedByUserId', to: 'users.id', }, }, }; } }