Update document and email message schemas to allow optional object references and introduce a new email recipient schema. Adjust required fields and enhance indexing for better data management.
All checks were successful
farmcontrol/farmcontrol-scheduler/pipeline/head This commit looks good

This commit is contained in:
Tom Butcher 2026-09-15 16:32:01 +01:00
parent 21517ca5c6
commit e0e7951ff2
2 changed files with 41 additions and 14 deletions

View File

@ -14,8 +14,15 @@ const documentJobSchema = new Schema(
object: {
type: Schema.Types.ObjectId,
refPath: 'objectType',
required: true,
required: false,
},
objects: [
{
type: Schema.Types.ObjectId,
refPath: 'objectType',
required: false,
},
],
state: {
type: { type: String, required: true, default: 'queued' },
progress: { type: Number, required: false },

View File

@ -3,6 +3,32 @@ import { generateId } from '../../utils.js';
const { Schema } = mongoose;
const emailRecipientSchema = new Schema(
{
recipientEmail: { type: String, required: true },
recipientType: { type: String, enum: ['client', 'vendor'], required: false },
recipient: {
type: Schema.Types.ObjectId,
refPath: 'recipients.recipientType',
required: false,
},
objectType: { type: String, required: false },
object: {
type: Schema.Types.ObjectId,
refPath: 'recipients.objectType',
required: false,
},
pixelId: { type: String, required: true },
messageId: { type: String, required: false },
attachments: [{ type: Schema.Types.ObjectId, ref: 'file', required: false }],
read: { type: Boolean, required: true, default: false },
sent: { type: Boolean, required: true, default: false },
sentAt: { type: Date, required: false },
readAt: { type: Date, required: false },
},
{ _id: true }
);
const emailMessageSchema = new Schema(
{
_reference: { type: String, default: () => generateId()() },
@ -13,42 +39,36 @@ const emailMessageSchema = new Schema(
required: true,
},
objectType: { type: String, required: true },
object: { type: Schema.Types.ObjectId, refPath: 'objectType', required: true },
object: { type: Schema.Types.ObjectId, refPath: 'objectType', required: false },
objects: [{ type: Schema.Types.ObjectId, refPath: 'objectType', required: false }],
emailAccount: {
type: Schema.Types.ObjectId,
ref: 'emailAccount',
required: true,
},
recipientEmail: { type: String, required: true },
recipientType: { type: String, enum: ['client', 'vendor'], required: false },
recipient: {
type: Schema.Types.ObjectId,
refPath: 'recipientType',
required: false,
},
recipients: { type: [emailRecipientSchema], required: true, default: [] },
fromEmail: { type: String, required: true, immutable: true },
messageId: { type: String, required: false },
subject: { type: String, required: false, default: '' },
content: { type: String, required: false, default: '' },
attachments: [{ type: Schema.Types.ObjectId, ref: 'file', required: false }],
state: {
type: { type: String, required: true, default: 'queued' },
progress: { type: Number, required: false, default: 0 },
message: { type: String, required: false },
},
read: { type: Boolean, required: true, default: false },
sentAt: { type: Date, required: false },
readAt: { type: Date, required: false },
firstReadAt: { type: Date, required: false },
lastReadAt: { type: Date, required: false },
},
{ timestamps: true, suppressReservedKeysWarning: true }
);
emailMessageSchema.index({
name: 'text',
recipientEmail: 'text',
fromEmail: 'text',
objectType: 'text',
'recipients.recipientEmail': 'text',
});
emailMessageSchema.index({ 'recipients.pixelId': 1 }, { unique: true, sparse: true });
emailMessageSchema.virtual('id').get(function () {
return this._id;
});