import { ObjectID } from 'mongodb'; import { prop, index, Ref, getModelForClass, modelOptions } from '@typegoose/typegoose'; export type Create = Omit; export enum MailboxType { Box = 'NORMAL_BOX', Archives = 'ARCHIVES', All = '\\All', Drafts = '\\Drafts', Starred = '\\Flagged', Important = '\\Important', Inbox = '\\Inbox', Spam = '\\Junk', Sent = '\\Sent', Trash = '\\Trash' }; @modelOptions({ schemaOptions: { versionKey: false }}) @index({ address: 1 }) export class Account { id!: string; _id!: ObjectID; @prop({ required: true }) name!: string; @prop() image?: string; @prop({ required: true }) address!: string; @prop({ required: true }) password!: string; @prop({ required: true }) host!: string; @prop({ required: true }) port!: number; @prop({ default: true }) tls!: boolean; }; export const AccountModel = getModelForClass(Account); @modelOptions({ schemaOptions: { versionKey: false }}) @index({ account: 1, path: 1 }) export class Mailbox { id!: string; _id!: ObjectID; @prop({ required: true, ref: Account }) account!: Ref; @prop({ required: true }) name!: string; @prop({ required: true }) path!: string; @prop({ required: true }) delimiter!: string; @prop({ required: true }) type!: MailboxType; @prop({ required: true, type: [String] }) private _treeTypes!: MailboxType[]; get treeTypes(): Set { return new Set(this._treeTypes); } set treeTypes(treeTypes: Set) { this._treeTypes = [ ...treeTypes ]; } @prop({ ref: Mailbox }) parent?: Ref; @prop({ required: true }) uidValidity!: number; @prop({ required: true }) uidNext!: number; }; export const MailboxModel = getModelForClass(Mailbox); @modelOptions({ schemaOptions: { versionKey: false }}) export class Contact { id!: string; _id!: ObjectID; @prop({ default: false }) userCreated?: boolean; @prop({ required: true }) name!: string; @prop({ default: [], type: [String]}) addresses?: string[]; }; export const ContactModel = getModelForClass(Contact); @modelOptions({ schemaOptions: { versionKey: false }}) @index({ account: 1, messageId: 1 }) @index({ account: 1, box: 1, uid: 1 }) export class Message { id!: string; _id!: ObjectID; @prop({ required: true, ref: Account }) account!: Ref; @prop({ required: true, ref: Mailbox }) box!: Ref; @prop({ required: true }) uid!: number; @prop({ required: true }) messageId!: string; @prop({ required: true }) subject!: string; @prop({ required: true }) date!: Date; // @prop({ required: true, ref: Contact }) // from!: Ref; // @prop({ required: true, ref: Contact }) // to!: Ref[]; }; export const MessageModel = getModelForClass(Message);