Files
Superalgos/src/models/event.js
T
2019-02-12 14:16:56 +01:00

192 lines
3.4 KiB
JavaScript

import mongoose, { Schema } from 'mongoose';
import Plotter from './plotter';
import Formula from './formula';
import {
UNPUBLISHED,
EventStateEnum,
} from '../enums/EventState';
import {
ENLISTED,
ParticipantStateEnum,
} from '../enums/ParticipantState';
import {
OTHER,
HistoryTypeEnum,
} from '../enums/HistoryType';
const { ObjectId } = Schema.Types;
const eventSchema = new Schema({
title: {
type: String,
required: true,
},
subtitle: {
type: String,
required: true,
},
hostId: {
type: String,
required: true,
},
description: String,
startDatetime: {
type: Number,
required: true,
},
endDatetime: {
type: Number,
required: true,
},
state: {
type: String,
enum: EventStateEnum,
default: UNPUBLISHED,
},
history: [{
date: {
type: Number,
required: true,
},
action: {
data: String,
type: {
type: String,
enum: HistoryTypeEnum,
default: OTHER,
},
comment: String,
},
}],
rules: [{
title: {
type: String,
required: true,
},
description: String,
}],
rulesHistory: [{
date: {
type: Number,
required: true,
},
action: {
data: String,
type: {
type: String,
enum: HistoryTypeEnum,
default: OTHER,
},
comment: String,
},
}],
prizes: [{
condition: {
from: Number,
to: Number,
additional: String,
},
pool: {
amount: {
type: Number,
required: true,
},
asset: {
type: String,
required: true,
},
},
}],
prizesHistory: [{
date: {
type: Number,
required: true,
},
action: {
data: String,
type: {
type: String,
enum: HistoryTypeEnum,
default: OTHER,
},
comment: String,
},
}],
participants: [{
participantId: {
type: String,
required: true,
},
state: {
type: String,
enum: ParticipantStateEnum,
default: ENLISTED,
},
history: [{
date: {
type: Number,
required: true,
},
action: {
data: String,
type: {
type: String,
enum: HistoryTypeEnum,
default: OTHER,
},
comment: String,
},
}],
operationId: String,
}],
invitations: [{
inviteeId: {
type: String,
required: true,
},
acceptedDate: Number,
refusedDate: Number,
by: {
date: Number,
inviterId: {
type: String,
required: true,
},
},
}],
presentation: {
banner: String,
profile: String,
page: String,
},
formulaId: {
type: ObjectId,
ref: Formula.modelName,
},
plotterId: {
type: ObjectId,
ref: Plotter.modelName,
},
});
eventSchema.pre('find', function populate() {
this.populate('formulaId').populate('plotterId');
});
eventSchema.pre('findOne', function populate() {
this.populate('formulaId').populate('plotterId');
});
eventSchema.post('save', (doc, next) => {
doc.populate('formulaId').populate('plotterId').execPopulate().then(() => {
next();
});
});
eventSchema.post('findOneAndUpdate', (doc, next) => {
doc.populate('formulaId').populate('plotterId').execPopulate().then(() => {
next();
});
});
const Event = mongoose.model('Event', eventSchema);
export default Event;