app2-api/modules/events/event.model.js

273 lines
7.9 KiB
JavaScript
Raw Normal View History

'use strict';
2019-07-16 16:27:54 +00:00
const moment = require('moment');
const Sequelize = require('sequelize');
2019-07-21 18:48:19 +00:00
const getStateText = (conference) => {
var currentDate = moment().utc(),
initDate = moment.utc(conference.ini_date),
endDate = moment.utc(conference.end_date),
init_availableDate = moment.utc(conference.init_available_date),
end_availableDate = moment.utc(conference.end_available_date),
isFull = (conference.confirmed > conference.assistans);
if (moment(currentDate).isBetween(initDate, endDate)) {
return 'Congreso en curso';
} else {
if (moment(endDate).isBefore(currentDate)) {
return 'Congreso finalizado';
} else {
if (moment(currentDate).isBetween(init_availableDate, end_availableDate)) {
return isFull ? 'Inscripciones abiertas a lista de espera' : 'Inscripciones abiertas';
} else {
return 'Inscripciones a partir del ' + moment(init_availableDate).format('ll');
}
}
};
};
module.exports = function (sequelize, DataTypes) {
2019-07-21 18:48:19 +00:00
const Event = sequelize.define('Event', {
id: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
primaryKey: true,
},
name: {
type: DataTypes.STRING,
allowNull: false,
},
description: {
type: DataTypes.STRING,
},
2019-06-26 10:24:58 +00:00
campaign_text: {
type: DataTypes.TEXT,
allowNull: true
},
2019-07-17 14:47:27 +00:00
init_date: {
type: DataTypes.DATE,
allowNull: false,
2019-07-17 14:47:27 +00:00
},
end_date: {
type: DataTypes.DATE,
},
2019-07-10 08:42:03 +00:00
init_available_date: {
type: DataTypes.DATE,
},
2019-07-10 08:42:03 +00:00
end_available_date: {
type: DataTypes.DATE,
},
gmt: {
type: DataTypes.INTEGER,
defaultValue: 1,
},
assistants: {
type: DataTypes.INTEGER,
},
confirmed: {
type: DataTypes.INTEGER,
},
allow_multiple: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: false,
},
multiple_limit: {
type: DataTypes.INTEGER,
},
allow_overflow: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: false,
},
overflow_eventId: {
type: DataTypes.UUID,
foreignKey: true,
2019-07-16 16:27:54 +00:00
require: false,
},
state: {
type: DataTypes.STRING,
allowNull: false,
2019-07-17 12:07:35 +00:00
defaultValue: 'draft'
},
2019-07-21 18:48:19 +00:00
stateText: {
type: Sequelize.VIRTUAL(Sequelize.STRING, ['init_date', 'end_date', 'init_available_date', 'end_available_date', 'assistants', 'confirmed']),
get: function () {
return getStateText(this);
},
},
typeId: {
type: DataTypes.UUID,
foreignKey: true,
},
venueId: {
type: DataTypes.UUID,
foreignKey: true,
},
url_streaming: {
type: DataTypes.STRING,
},
url_poll: {
type: DataTypes.STRING,
},
url_registration: {
type: DataTypes.STRING,
},
2019-07-17 12:07:35 +00:00
marketing_list: {
2019-07-05 07:06:29 +00:00
type: DataTypes.STRING,
},
2019-07-11 18:05:06 +00:00
userId: {
type: DataTypes.UUID,
foreignKey: true,
},
}, {
tableName: 'events',
freezeTableName: true,
timestamps: true,
2019-07-16 16:27:54 +00:00
defaultScope: {
2019-07-17 12:07:35 +00:00
where: {
state: 'publish'
2019-07-18 18:26:57 +00:00
},
include: [{
model: sequelize.models.EventType,
as: 'type',
attributes: ['name', 'title'],
}]
2019-07-16 16:27:54 +00:00
},
});
2019-07-17 12:07:35 +00:00
Event.associate = function (models) {
2019-07-16 16:27:54 +00:00
// Event.OverflowEvent = Event.belongsTo(models.Event, {
// as: 'overflowEvent',
// foreignKey: 'overflow_eventId',
// required: false });
2019-07-14 16:44:59 +00:00
Event.Type = Event.belongsTo(models.EventType, { foreignKey: 'typeId', as: "type" });
Event.UserCreate = Event.belongsTo(models.User, { foreignKey: 'userId', as: "user" });
Event.Venue = Event.belongsTo(models.Venue, { foreignKey: 'venueId', as: "venue" });
2019-07-17 14:47:27 +00:00
Event.Details = Event.hasMany(models.EventDetail, { foreignKey: 'eventId', as: "details" });
2019-07-09 17:39:52 +00:00
2019-07-17 14:47:27 +00:00
//OJOJOJOJOJOJOJJOJ
// OJO GENERA UN FOREIGN KEY Con eventos y habrá ID de otras entidades que no exitan en la tabla eventos, porque son post o speakers
// Event.Comments = Event.hasMany(models.Comment, {
// foreignKey: 'entityId',
// scope: {
// entityName: 'event'
// },
// as: "comments"
// });
2019-07-09 17:39:52 +00:00
2019-07-17 14:47:27 +00:00
// Event.Multimedias = Event.hasMany(models.Multimedia, {
// foreignKey: 'entityId',
// scope: {
// entityName: 'event'
// },
// as: { singular: 'multimedia', plural: 'multimedias' }});
2019-06-26 10:24:58 +00:00
2019-07-18 16:13:27 +00:00
Event.Multimedias = Event.hasMany(models.Multimedia, {
foreignKey: 'entityId',
as: { singular: 'multimedia', plural: 'multimedias' }
});
2019-07-14 16:44:59 +00:00
Event.Reservations = Event.hasMany(models.EventReservation, { foreignKey: 'eventId', as: "reservations" });
Event.Inscriptions = Event.hasMany(models.EventInscription, { foreignKey: 'eventId', as: "inscriptions" });
Event.Questions = Event.hasMany(models.EventQuestion, { foreignKey: 'eventId', as: "questions" });
};
2019-07-17 12:07:35 +00:00
Event.addScope('includeVenue', () => {
return {
include: [
{ model: sequelize.models.Venue, as: 'venue' }
]
}
});
2019-07-17 14:47:27 +00:00
Event.addScope('includeDetails', () => {
2019-07-17 12:07:35 +00:00
return {
include: [
2019-07-17 14:47:27 +00:00
{ model: sequelize.models.EventDetail, as: 'details' }
2019-07-17 12:07:35 +00:00
]
}
});
2019-07-18 16:13:27 +00:00
Event.addScope('includeMultimedias', () => {
return {
include: [{
model: sequelize.models.Multimedia,
as: 'multimedias',
required: false,
include : [{
model: sequelize.models.MultimediaFile,
}]
},
]
}
});
2019-07-21 17:36:25 +00:00
Event.addScope('includeInscription', (userId) => {
return {
include: [
{ model: sequelize.models.EventInscription, as: 'inscriptions', where: {userId: userId} }
]
}
});
2019-07-17 12:07:35 +00:00
Event.addScope('includeSpeakers', () => {
return {
include: [{
2019-07-17 14:47:27 +00:00
model: sequelize.models.EventDetail,
2019-07-17 15:13:55 +00:00
as: 'details',
2019-07-17 12:07:35 +00:00
where: {
2019-07-17 15:13:55 +00:00
type: 'speaker'
2019-07-17 12:07:35 +00:00
},
2019-07-18 11:23:43 +00:00
required: false,
2019-07-17 15:34:54 +00:00
include: [{
model: sequelize.models.Speaker,
as: 'speaker',
2019-07-18 16:13:27 +00:00
required: false,
2019-07-17 15:34:54 +00:00
include : [{
model: sequelize.models.Multimedia,
as: 'multimedias',
2019-07-18 16:13:27 +00:00
required: false,
2019-07-17 15:34:54 +00:00
include: [{
model: sequelize.models.MultimediaFile,
}]
}]
}]
2019-07-17 12:07:35 +00:00
}]
}
2019-07-21 17:36:25 +00:00
});
2019-07-17 12:07:35 +00:00
Event.addScope('next', {
where: {
2019-07-17 15:13:55 +00:00
init_date: {
2019-07-17 12:07:35 +00:00
[Sequelize.Op.gte]: moment().add(1, 'days').startOf('day').utc()
}
},
});
Event.addScope('current', {
where: {
2019-07-17 15:13:55 +00:00
init_date: {
2019-07-17 12:07:35 +00:00
[Sequelize.Op.gte]: moment().startOf('day').utc(),
[Sequelize.Op.lt]: moment().add(1, 'days').startOf('day').utc(),
}
}
});
Event.addScope('past', {
where: {
2019-07-17 15:13:55 +00:00
init_date: {
2019-07-17 12:07:35 +00:00
[Sequelize.Op.lt]: moment().startOf('day').utc()
}
}
});
return Event;
};