hexabot/api/src/chat/schemas/message.schema.ts
Mohamed Marrouchi 7b275c40f4 fix: ts issue
2024-10-22 15:10:39 +01:00

109 lines
2.8 KiB
TypeScript

/*
* Copyright © 2024 Hexastack. All rights reserved.
*
* Licensed under the GNU Affero General Public License v3.0 (AGPLv3) with the following additional terms:
* 1. The name "Hexabot" is a trademark of Hexastack. You may not use this name in derivative works without express written permission.
* 2. All derivative works must include clear attribution to the original creator and software, Hexastack and Hexabot, in a prominent location (e.g., in the software's "About" section, documentation, and README file).
*/
import { ModelDefinition, Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Transform, Type } from 'class-transformer';
import { Schema as MongooseSchema } from 'mongoose';
import { BaseSchema } from '@/utils/generics/base-schema';
import { LifecycleHookManager } from '@/utils/generics/lifecycle-hook-manager';
import { TFilterPopulateFields } from '@/utils/types/filter.types';
import { Subscriber } from './subscriber.schema';
import { StdIncomingMessage, StdOutgoingMessage } from './types/message';
@Schema({ timestamps: true })
export class MessageStub extends BaseSchema {
@Prop({
type: String,
required: false,
//TODO : add default value for mid
})
mid?: string;
@Prop({
type: MongooseSchema.Types.ObjectId,
required: false,
ref: 'Subscriber',
})
sender?: unknown;
@Prop({
type: MongooseSchema.Types.ObjectId,
required: false,
ref: 'Subscriber',
})
recipient?: unknown;
@Prop({
type: MongooseSchema.Types.ObjectId,
required: false,
ref: 'User',
})
sentBy?: unknown;
@Prop({
type: Object,
required: true,
})
message: StdOutgoingMessage | StdIncomingMessage;
@Prop({
type: Boolean,
default: false,
})
read?: boolean;
@Prop({
type: Boolean,
default: false,
})
delivery?: boolean;
@Prop({
type: Boolean,
default: false,
})
handover?: boolean;
}
@Schema({ timestamps: true })
export class Message extends MessageStub {
@Transform(({ obj }) => obj.sender?.toString())
sender?: string;
@Transform(({ obj }) => obj.recipient?.toString())
recipient?: string;
@Transform(({ obj }) => obj.sentBy?.toString())
sentBy?: string;
}
@Schema({ timestamps: true })
export class MessageFull extends MessageStub {
@Type(() => Subscriber)
sender?: Subscriber;
@Type(() => Subscriber)
recipient?: Subscriber;
@Transform(({ obj }) => obj.sentBy?.toString())
sentBy?: string; // sendBy is never populate
}
export const MessageModel: ModelDefinition = LifecycleHookManager.attach({
name: Message.name,
schema: SchemaFactory.createForClass(MessageStub),
});
export default MessageModel.schema;
export type MessagePopulate = keyof TFilterPopulateFields<Message, MessageStub>;
export const MESSAGE_POPULATE: MessagePopulate[] = ['sender', 'recipient'];