50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import { Model, ModelOptions, QueryContext } from 'objection';
|
|
|
|
export class BaseModel extends Model {
|
|
/**
|
|
* Use a minimal column mapper: keep property names as-is, but handle
|
|
* timestamp fields that are stored as created_at/updated_at in the DB.
|
|
*/
|
|
static columnNameMappers = {
|
|
parse(dbRow: Record<string, any>) {
|
|
const mapped: Record<string, any> = {};
|
|
for (const [key, value] of Object.entries(dbRow || {})) {
|
|
if (key === 'created_at') {
|
|
mapped.createdAt = value;
|
|
} else if (key === 'updated_at') {
|
|
mapped.updatedAt = value;
|
|
} else {
|
|
mapped[key] = value;
|
|
}
|
|
}
|
|
return mapped;
|
|
},
|
|
format(model: Record<string, any>) {
|
|
const mapped: Record<string, any> = {};
|
|
for (const [key, value] of Object.entries(model || {})) {
|
|
if (key === 'createdAt') {
|
|
mapped.created_at = value;
|
|
} else if (key === 'updatedAt') {
|
|
mapped.updated_at = value;
|
|
} else {
|
|
mapped[key] = value;
|
|
}
|
|
}
|
|
return mapped;
|
|
},
|
|
};
|
|
|
|
id: string;
|
|
createdAt: Date;
|
|
updatedAt: Date;
|
|
|
|
$beforeInsert(queryContext: QueryContext) {
|
|
this.createdAt = new Date();
|
|
this.updatedAt = new Date();
|
|
}
|
|
|
|
$beforeUpdate(opt: ModelOptions, queryContext: QueryContext) {
|
|
this.updatedAt = new Date();
|
|
}
|
|
}
|