Files
freeplanet_serverside/src/server/models/attivita.js
2025-03-03 01:07:00 +01:00

398 lines
7.7 KiB
JavaScript
Executable File

const mongoose = require('mongoose').set('debug', false);
const Schema = mongoose.Schema;
mongoose.Promise = global.Promise;
mongoose.level = 'F';
const tools = require('../tools/general');
const { Reaction } = require('./reaction');
const { MyGroup } = require('./mygroup');
const shared_consts = require('../tools/shared_nodejs');
const { ObjectId } = require('mongodb');
const tableModel = shared_consts.TABLES_ATTIVITAS;
// Resolving error Unknown modifier: $pushAll
mongoose.plugin(schema => {
schema.options.usePushEach = true;
});
const AttivitaSchema = new Schema(
{
...{
_id: {
type: String,
default: function () {
return new ObjectId().toString();
},
},
idapp: {
type: String,
required: true,
},
// userId: { type: Schema.Types.ObjectId, ref: 'User' },
idSector: {
type: Number,
},
idSkill: {
type: Number,
default: 0,
},
idCity: [
{
type: Number,
}],
logo:
{
imagefile: {
type: String,
},
alt: {
type: String,
},
description: {
type: String,
},
},
photos: [
{
imagefile: {
type: String,
},
alt: {
type: String,
},
description: {
type: String,
},
}],
note: {
type: String,
default: '',
},
website: {
type: String,
},
date_created: {
type: Date,
},
date_updated: {
type: Date,
},
tipodiAttivita: {
type: Number,
},
descr: {
type: String,
},
note: {
type: String,
},
coordinate_gps: {
address: {
type: String,
default: '',
},
type: {
type: String,
enum: ['Point'], // Specifica il tipo, in questo caso solo 'Point'
required: false,
},
coordinates: {
type: [Number], // L'array dovrebbe contenere lon e lat
required: false,
index: '2dsphere' // Indice geospaziale [lng, lat]
},
},
email: {
type: String,
},
telegram_username: {
type: String,
},
cell_phone: {
type: String,
},
whatsapp: {
type: String,
},
createdBy: { // Username del creatore (proponente)
type: String,
},
//**ADDFIELD_ATTIVITA
},
...Reaction.getFieldsForReactions(),
...tools.getFieldsForAnnunci()
}, { strict: false });
AttivitaSchema.pre('save', async function (next) {
if (this.isNew) {
if (!this.date_created)
this.date_created = new Date();
}
next();
});
AttivitaSchema.statics.findAllIdApp = async function (idapp) {
const Attivita = this;
const query = [
{ $match: { idapp } },
{ $sort: { descr: 1 } },
];
return await Attivita.aggregate(query).then((arrrec) => {
return arrrec;
});
};
AttivitaSchema.statics.getFieldsForSearch = function () {
return [];
};
AttivitaSchema.statics.getFieldsLastForSearch = function () {
return [
{ field: 'note', type: tools.FieldType.string },
{ field: 'descr', type: tools.FieldType.string },
{ field: 'recSkill.descr', type: tools.FieldType.string },
{ field: 'attivita.descr', type: tools.FieldType.string },
];
};
AttivitaSchema.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);
};
AttivitaSchema.statics.getMyRecById = function (idapp, idSkill) {
const Attivita = this;
let query = [
{
'$match': {
'_id': idSkill, idapp
},
},
{
'$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',
],
},
},
},
{
$project: shared_consts.getProjectForAll({}, tableModel),
},
{
'$replaceRoot': {
'newRoot': {
'$mergeObjects': [
{
'$arrayElemAt': [
'$attivita',
0,
],
},
'$$ROOT',
],
},
},
},
{
$project: shared_consts.getProjectForAll({}, tableModel),
},
{
'$lookup': {
'from': 'cities',
'localField': 'idCity',
'foreignField': '_id',
'as': 'mycities',
},
},
{
'$replaceRoot': {
'newRoot': {
'$mergeObjects': [
{
'$arrayElemAt': [
'$mycities',
0,
],
},
'$$ROOT',
],
},
},
},
];
let numtab = tools.getNumTabByTable(shared_consts.TABLES_ATTIVITAS);
const objadd = tools.addNumFavoriteAndBookmarkToQuery(idapp, numtab);
query = [...query, ...objadd.query];
const toadd = {
$project: shared_consts.getProjectForAll(objadd.proj, tableModel),
};
query = [...query, { ...toadd }];
return Attivita.aggregate(query).then((rec) => {
return rec ? rec[0] : null;
});
};
AttivitaSchema.statics.getProject = function (proj_add2) {
let proj = {
recSkill: 1,
sector: 1,
idSector: 1,
idSkill: 1,
idCity: 1,
logo: 1,
photos: 1,
note: 1,
descr: 1,
website: 1,
date_created: 1,
date_updated: 1,
tipodiAttivita: 1,
coordinate_gps: 1,
email: 1,
telegram_username: 1,
cell_phone: 1,
whatsapp: 1,
createdBy: 1,
//**ADDFIELD_ATTIVITA
};
const proj_add = shared_consts.getProjectForAll(proj_add2)
return Object.assign({}, proj, proj_add);
}
AttivitaSchema.statics.getCompleteRecord = function (idapp, id) {
const Attivita = this;
return Attivita.getMyRecById(idapp, id);
};
const Attivita = mongoose.model('Attivita', AttivitaSchema);
Attivita.createIndexes()
.then(() => { })
.catch((err) => { throw err; });
module.exports = { Attivita };