import { ObjectId } from 'mongodb'; import { CreateDateColumn, EntitySubscriberInterface, EventSubscriber, InsertEvent, ObjectIdColumn, UpdateDateColumn, UpdateEvent, } from 'typeorm'; import { ExtendedPaginateConfig, IBaseMongoEntity } from './base.mongo.entity.interface'; export class BaseMongoEntity implements IBaseMongoEntity { @ObjectIdColumn() _id: ObjectId; @CreateDateColumn({ type: 'timestamp', }) createdAt: Date; @UpdateDateColumn({ type: 'timestamp', }) updatedAt: Date; } @EventSubscriber() export class BaseMongoEntitySubscriber implements EntitySubscriberInterface { /** * Indicates that this subscriber only listens to BaseMongoEntity events. */ public listenTo() { return BaseMongoEntity; } /** * Called before entity insertion. */ public beforeInsert(event: InsertEvent) { const now = new Date(); now.setMilliseconds((now.getMilliseconds() + 1) % 1000); event.entity.createdAt = now; event.entity.updatedAt = now; } public beforeUpdate(event: UpdateEvent): void | Promise { const now = new Date(); now.setMilliseconds((now.getMilliseconds() + 1) % 1000); event.entity.updatedAt = now; } } export const paginationConfig: ExtendedPaginateConfig = { sortableColumns: ['_id', 'createdAt', 'updatedAt'], searchableColumns: ['_id', 'createdAt', 'updatedAt'], filterableColumns: { _id: true, createdAt: true, updatedAt: true, }, select: ['_id', 'createdAt', 'updatedAt'], relativePath: true, dateColumns: ['createdAt', 'updatedAt'], };