const mongoose = require('mongoose').set('debug', false); const Schema = mongoose.Schema; mongoose.Promise = global.Promise; mongoose.level = 'F'; const tools = require('../tools/general'); const { ObjectId } = require('mongodb'); const shared_consts = require('../tools/shared_nodejs'); const { Reaction } = require('./reaction'); const { MyGroup } = require('./mygroup'); const tableModel = shared_consts.TABLES_MYBACHECAS; // Resolving error Unknown modifier: $pushAll mongoose.plugin((schema) => { schema.options.usePushEach = true; }); const MyBachecaSchema = new Schema({ ...{ _id: { type: String, default: function () { return new ObjectId().toString(); }, }, idapp: { type: String, required: true, }, userId: { type: Schema.Types.ObjectId, ref: 'User' }, groupname: { type: String }, idSector: { type: Number, }, idSkill: { type: Number, default: 0, }, idStatusSkill: [ { type: Number, }, ], idContribType: [ { type: String, }, ], idCity: [ { type: Number, }, ], dateTimeStart: { type: Date, }, dateTimeEnd: { type: Date, required: false, // non obbligatorio default: null, // valore predefinito esplicito (opzionale) }, organisedBy: { type: String, }, contact_phone: { type: String, }, contact_email: { type: String, }, contact_telegram: { type: String, }, address: { type: String, }, min_partecip: { type: Number, }, max_partecip: { type: Number, }, link_maplocation: { type: String, }, contribstr: { type: String, }, numLevel: { type: Number, default: 0, }, adType: { type: Number, }, photos: [ { imagefile: { type: String, }, alt: { type: String, }, description: { type: String, }, }, ], note: { type: String, default: '', }, descr: { type: String, }, //**ADDFIELD_MYBACHECAS website: { type: String, }, date_created: { type: Date, }, date_updated: { type: Date, }, link_conference: { type: String, }, }, ...Reaction.getFieldsForReactions(), ...tools.getFieldsForAnnunci(), }); MyBachecaSchema.pre('save', async function (next) { if (this.isNew) { if (!this.date_created) this.date_created = new Date(); } next(); }); MyBachecaSchema.statics.findAllIdApp = async function (idapp) { const MyBacheca = this; const query = [{ $match: { idapp } }, { $sort: { descr: 1 } }]; return await MyBacheca.aggregate(query); }; MyBachecaSchema.statics.getFieldsForSearch = function () { return []; }; MyBachecaSchema.statics.getFieldsLastForSearch = function () { return [ { field: 'note', type: tools.FieldType.string }, { field: 'descr', type: tools.FieldType.string }, { field: 'recSkill.descr', type: tools.FieldType.string }, { field: 'MyBacheca.descr', type: tools.FieldType.string }, ]; }; MyBachecaSchema.statics.executeQueryTable = function (idapp, params, user) { params.fieldsearch = this.getFieldsForSearch(); params.fieldsearch_last = this.getFieldsLastForSearch(); const otherparams = { lookup1: { lk_tab: 'users', lk_LF: 'userId', lk_FF: '_id', lk_as: 'user', af_objId_tab: 'myId', lk_proj: shared_consts.getProjectForAll({}, tableModel), }, }; params = { ...params, ...otherparams }; return tools.executeQueryTable(this, idapp, params, user); }; MyBachecaSchema.statics.getMyRecById = function (idapp, id) { const MyBacheca = this; let myparsid = { _id: id, idapp, }; let query = [ { $match: myparsid, }, { $sort: { desc: 1, }, }, { $addFields: { myId1: { $toObjectId: '$userId', }, }, }, { $lookup: { from: 'users', localField: 'myId1', foreignField: '_id', as: 'user', }, }, { $replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: ['$user', 0], }, '$$ROOT', ], }, }, }, { $project: shared_consts.getProjectForAll({}, tableModel), }, { $lookup: { from: 'skills', localField: 'idSkill', foreignField: '_id', as: 'recSkill', }, }, { $replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: ['$recSkill', 0], }, '$$ROOT', ], }, }, }, { $project: shared_consts.getProjectForAll({}, tableModel), }, { $lookup: { from: 'sectors', localField: 'idSector', foreignField: '_id', as: 'sector', }, }, { $replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: ['$sector', 0], }, '$$ROOT', ], }, }, }, { $lookup: { from: 'mygroups', localField: 'groupname', foreignField: 'groupname', as: 'mygrp', }, }, { $unwind: { path: '$mygrp', preserveNullAndEmptyArrays: true, }, }, { $project: shared_consts.getProjectForAll({}, tableModel), }, /*{ '$lookup': { 'from': 'subskills', 'localField': 'idSubSkill', 'foreignField': '_id', 'as': 'MyBacheca', }, },*/ { $replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: ['$MyBacheca', 0], }, '$$ROOT', ], }, }, }, { $project: shared_consts.getProjectForAll({}, tableModel), }, { $lookup: { from: 'cities', localField: 'idCity', foreignField: '_id', as: 'mycities', }, }, { $replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: ['$mycities', 0], }, '$$ROOT', ], }, }, }, ]; try { let numtab = tools.getNumTabByTable(shared_consts.TABLES_MYBACHECAS); let objadd = tools.addNumFavoriteAndBookmarkToQuery(idapp, numtab); query = [...query, ...objadd.query]; const toadd = { $project: shared_consts.getProjectForAll(objadd.proj, tableModel), }; query = [...query, { ...toadd }]; } catch (e) { console.error('e', e); } return MyBacheca.aggregate(query).then((rec) => { return rec ? rec[0] : null; }); }; MyBachecaSchema.statics.getCompleteRecord = function (idapp, id) { const MyBacheca = this; return MyBacheca.getMyRecById(idapp, id); }; const MyBacheca = mongoose.model('MyBacheca', MyBachecaSchema); MyBacheca.createIndexes() .then(() => {}) .catch((err) => { throw err; }); module.exports = { MyBacheca };