114 lines
2.9 KiB
TypeScript
114 lines
2.9 KiB
TypeScript
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',
|
|
},
|
|
},
|
|
};
|
|
}
|
|
}
|