Files
freeplanet_serverside/src/server/models/mygroup.js

517 lines
11 KiB
JavaScript
Raw Normal View History

2022-09-14 11:32:04 +02:00
const mongoose = require('mongoose').set('debug', false);
2022-02-03 00:33:15 +01:00
const Schema = mongoose.Schema;
const tools = require('../tools/general');
const shared_consts = require('../tools/shared_nodejs');
2022-02-03 00:33:15 +01:00
mongoose.Promise = global.Promise;
mongoose.level = 'F';
// Resolving error Unknown modifier: $pushAll
mongoose.plugin(schema => {
schema.options.usePushEach = true;
});
const MyGroupSchema = new Schema({
_id: {
type: Number,
},
2022-02-03 00:33:15 +01:00
idapp: {
type: String,
},
groupname: {
type: String,
},
title: {
type: String,
},
descr: {
type: String,
},
idCatGrp: {
2022-02-03 00:33:15 +01:00
type: Number,
},
userId: {
type: String,
},
photos: [
{
imagefile: {
type: String,
},
alt: {
type: String,
},
description: {
type: String,
},
}],
idCity: [
{
type: Number,
}],
website: {
type: String,
},
link_telegram: {
type: String,
},
note: {
type: String,
default: '',
},
//**ADDFIELD_MYGROUPS
visibility: [
{
type: Number,
},
],
pwd_cryp: {
type: String,
2022-02-03 00:33:15 +01:00
},
createdBy: {
type: String,
},
2022-02-03 00:33:15 +01:00
admins: [
{
2023-01-03 16:51:32 +01:00
username: { type: String },
perm: { type: Number },
date: { type: Date },
2022-02-03 00:33:15 +01:00
},
],
blocked: {
type: Boolean,
},
username_who_block: {
type: String,
},
date_created: {
type: Date,
},
date_updated: {
type: Date,
2022-02-03 00:33:15 +01:00
},
date_blocked: {
type: Date,
},
req_users: [
{
_id: false,
2023-01-03 16:51:32 +01:00
username: { type: String },
date: { type: Date },
2022-02-03 00:33:15 +01:00
}], // username
refused_users: [
{
_id: false,
2023-01-03 16:51:32 +01:00
username: { type: String },
date: { type: Date },
}], // username
2022-02-03 00:33:15 +01:00
deleted: {
type: Boolean,
default: false,
},
2023-01-03 16:51:32 +01:00
mycircuits: [
2022-08-17 00:36:47 +02:00
{
2023-01-03 16:51:32 +01:00
_id: false,
circuitname: { type: String },
date: { type: Date },
2022-08-17 00:36:47 +02:00
}],
2022-02-03 00:33:15 +01:00
});
2023-01-03 16:51:32 +01:00
MyGroupSchema.statics.getFieldsForSearch = function () {
return [{ field: 'descr', type: tools.FieldType.string }];
2022-02-03 00:33:15 +01:00
};
2023-01-03 16:51:32 +01:00
MyGroupSchema.statics.executeQueryTable = function (idapp, params, user) {
2022-02-03 00:33:15 +01:00
params.fieldsearch = this.getFieldsForSearch();
2023-01-03 16:51:32 +01:00
const { User } = require('./user');
if (params.options) {
if (tools.isBitActive(params.options, shared_consts.OPTIONS_SEARCH_USER_ONLY_FULL_WORDS)) {
params.fieldsearch = User.getFieldsForSearchUserFriend();
} else if (tools.isBitActive(params.options, shared_consts.OPTIONS_SEARCH_USER_ALL_WORDS)) {
params.fieldsearch = User.getFieldsForSearchUserFriend_AllWords();
}
}
return tools.executeQueryTable(this, idapp, params, user);
2022-02-03 00:33:15 +01:00
};
2023-01-03 16:51:32 +01:00
MyGroupSchema.pre('save', async function (next) {
if (this.isNew) {
2023-01-03 16:51:32 +01:00
const myrec = await MyGroup.findOne().limit(1).sort({ _id: -1 });
if (!!myrec) {
if (myrec._doc._id === 0)
this._id = 1;
else
this._id = myrec._doc._id + 1;
} else {
this._id = 1;
}
this.date_created = new Date();
}
next();
});
2023-01-03 16:51:32 +01:00
MyGroupSchema.statics.findAllIdApp = async function (idapp) {
const myfind = { idapp };
2022-02-03 00:33:15 +01:00
return await MyGroup.find(myfind);
};
2023-01-03 16:51:32 +01:00
MyGroupSchema.statics.findAllGroups = async function (idapp) {
const whatToShow = this.getWhatToShow(idapp, '');
return await MyGroup.find({
idapp,
$or: [
2023-01-03 16:51:32 +01:00
{ deleted: { $exists: false } },
{ deleted: { $exists: true, $eq: false } }],
}, whatToShow);
};
2022-02-03 00:33:15 +01:00
// Rimuovo la Richiesta del Gruppo
2023-01-03 16:51:32 +01:00
MyGroupSchema.statics.removeReqGroup = async function (idapp, username, groupnameDest) {
2022-02-03 00:33:15 +01:00
2023-01-03 16:51:32 +01:00
return await MyGroup.updateOne({ idapp, groupname: groupnameDest },
{ $pull: { req_users: { username: { $in: [username] } } } });
2022-02-03 00:33:15 +01:00
};
// Aggiungi agli utenti Rifiutati del Gruppo
2023-01-03 16:51:32 +01:00
MyGroupSchema.statics.refuseReqGroup = async function (idapp, username, groupnameDest) {
2023-01-03 16:51:32 +01:00
return await MyGroup.updateOne({ idapp, groupname: groupnameDest },
{
$push:
{
2023-01-03 16:51:32 +01:00
refused_users: {
username,
date: new Date(),
},
},
});
};
2022-08-09 17:32:06 +02:00
// Aggiungi agli Admin del Gruppo
2023-01-03 16:51:32 +01:00
MyGroupSchema.statics.addToAdminOfMyGroup = async function (idapp, username, groupnameDest) {
2022-08-09 17:32:06 +02:00
2023-01-03 16:51:32 +01:00
return await MyGroup.updateOne({ idapp, groupname: groupnameDest },
{
$push:
2022-08-09 17:32:06 +02:00
{
2023-01-03 16:51:32 +01:00
admins: {
username,
date: new Date(),
},
},
});
2022-08-09 17:32:06 +02:00
};
// Rimuovi dagli Admin del Gruppo
2023-01-03 16:51:32 +01:00
MyGroupSchema.statics.removeAdminOfMyGroup = async function (idapp, username, groupnameDest) {
return await MyGroup.updateOne({ idapp, groupname: groupnameDest },
{ $pull: { admins: { username: { $in: [username] } } } });
};
MyGroupSchema.statics.getListAdminsByGroupName = async function (idapp, groupname) {
let arr = await MyGroup.findOne({
idapp,
groupname,
$or: [
{ deleted: { $exists: false } },
{ deleted: { $exists: true, $eq: false } }],
}, {admins: 1}).lean();
return arr && arr.admins ? arr.admins : [];
2022-08-09 17:32:06 +02:00
};
2023-01-03 16:51:32 +01:00
MyGroupSchema.statics.getWhatToShow = function (idapp, username) {
// FOR ME, PERMIT ALL
2022-02-03 00:33:15 +01:00
return {
groupname: 1,
title: 1,
descr: 1,
visibility: 1,
idCatGrp: 1,
2022-02-03 00:33:15 +01:00
userId: 1,
photos: 1,
idCity: 1,
website: 1,
//**ADDFIELD_MYGROUPS
2022-02-03 00:33:15 +01:00
link_telegram: 1,
note: 1,
2022-02-03 00:33:15 +01:00
admins: 1,
blocked: 1,
req_users: 1,
refused_users: 1,
2022-08-09 17:32:06 +02:00
createdBy: 1,
date_created: 1,
date_updated: 1,
2023-01-03 16:51:32 +01:00
mycircuits: 1,
2022-02-03 00:33:15 +01:00
};
};
2022-02-03 00:33:15 +01:00
2023-01-03 16:51:32 +01:00
MyGroupSchema.statics.getWhatToShow_Unknown = function (idapp, username) {
2022-02-03 00:33:15 +01:00
return {
groupname: 1,
title: 1,
descr: 1,
photos: 1,
visibility: 1,
idCatGrp: 1,
2022-02-03 00:33:15 +01:00
idCity: 1,
note: 1,
date_created: 1,
date_updated: 1,
2023-01-03 16:51:32 +01:00
mycircuits: 1,
2022-02-03 00:33:15 +01:00
};
};
2022-02-03 00:33:15 +01:00
2023-01-03 16:51:32 +01:00
MyGroupSchema.statics.getArrUsernameFromFieldByGroupname = async function (
idapp, groupname, field) {
2022-02-03 00:33:15 +01:00
2023-01-03 16:51:32 +01:00
const { User } = require('../models/user');
2022-02-03 00:33:15 +01:00
const myobj = {};
myobj[field + '.' + subfield] = 1;
let arrrec = await User.findOne({
idapp,
groupname,
2023-01-03 16:51:32 +01:00
$or: [{ deleted: { $exists: false } }, { deleted: { $exists: true, $eq: false } }],
2022-02-03 00:33:15 +01:00
}, myobj).then((ris) => ris ? ris._doc[field] : []);
if (arrrec.length > 0) {
return arrrec.map(m => m.username);
}
return [];
};
2023-01-03 16:51:32 +01:00
MyGroupSchema.statics.getInfoGroupByGroupname = async function (idapp, groupname) {
2022-02-03 00:33:15 +01:00
const whatToShow = this.getWhatToShow(idapp, groupname);
2022-02-03 00:33:15 +01:00
2022-08-26 03:33:13 +02:00
const myfind = {
2022-02-03 00:33:15 +01:00
idapp,
groupname,
2022-08-26 03:33:13 +02:00
};
const query = [
2023-01-03 16:51:32 +01:00
{ $match: myfind },
{ $unwind: '$mycircuits' },
2022-08-26 03:33:13 +02:00
{
$lookup: {
from: 'circuits',
2023-01-03 16:51:32 +01:00
localField: 'mycircuits.circuitname',
foreignField: 'name',
2022-08-26 03:33:13 +02:00
as: 'mycircuits',
},
},
{
'$replaceRoot': {
'newRoot': {
'$mergeObjects': [
{
'$arrayElemAt': [
'$mycircuits',
0,
],
},
'$$ROOT',
],
},
},
},
2023-01-03 16:51:32 +01:00
{ $project: whatToShow },
2022-08-26 03:33:13 +02:00
];
try {
const ris = await MyGroup.aggregate(query);
if (ris && ris.length > 0)
return ris[0];
} catch (e) {
return null;
}
2022-07-28 23:27:51 +02:00
return ris;
2022-02-03 00:33:15 +01:00
};
2023-01-03 16:51:32 +01:00
MyGroupSchema.statics.deleteGroup = async function (idapp, usernameOrig, groupname) {
console.log('Gruppo ' + groupname + ' rimosso da ' + usernameOrig);
2023-01-03 16:51:32 +01:00
return await MyGroup.findOneAndRemove({ idapp, groupname });
};
2023-01-03 16:51:32 +01:00
MyGroupSchema.statics.getGroupsByUsername = async function (idapp, username, req) {
2022-02-03 00:33:15 +01:00
try {
2023-01-03 16:51:32 +01:00
const { User } = require('../models/user');
2022-02-03 00:33:15 +01:00
const whatToShow = this.getWhatToShow(idapp, username);
const whatToShow_Unknown = this.getWhatToShow_Unknown(idapp, username);
const arrUsernameGroups = await User.getUsernameGroupsByUsername(idapp, username);
2022-02-03 00:33:15 +01:00
// const arrUsernameReqGroups = await MyGroup.getUsernameReqGroupsByGroupname(idapp, username);
let listUsersGroup = await User.find({
idapp,
2023-01-03 16:51:32 +01:00
username: { $in: arrUsernameGroups },
2022-02-03 00:33:15 +01:00
$or: [
2023-01-03 16:51:32 +01:00
{ deleted: { $exists: false } },
{ deleted: { $exists: true, $eq: false } }],
2022-02-03 00:33:15 +01:00
}, whatToShow);
let listgroups = await MyGroup.find({
idapp,
$or: [
2023-01-03 16:51:32 +01:00
{ deleted: { $exists: false } },
{ deleted: { $exists: true, $eq: false } }],
2022-02-03 00:33:15 +01:00
}, whatToShow_Unknown);
/*let listRequestUsersGroup = await User.find({
idapp,
username: {$in: arrUsernameReqGroups},
$or: [
{deleted: {$exists: false}},
{deleted: {$exists: true, $eq: false}}],
}, whatToShow_Unknown);
*/
let listSentRequestGroups = await MyGroup.find({
idapp,
'req_users': {
2023-01-03 16:51:32 +01:00
$elemMatch: { username: { $eq: username } },
2022-02-03 00:33:15 +01:00
},
$or: [
2023-01-03 16:51:32 +01:00
{ deleted: { $exists: false } },
{ deleted: { $exists: true, $eq: false } }],
2022-02-03 00:33:15 +01:00
}, whatToShow_Unknown);
let listRefusedGroups = await MyGroup.find({
idapp,
'refused_users': {
2023-01-03 16:51:32 +01:00
$elemMatch: { username: { $eq: username } },
},
$or: [
2023-01-03 16:51:32 +01:00
{ deleted: { $exists: false } },
{ deleted: { $exists: true, $eq: false } }],
}, whatToShow_Unknown);
2022-02-03 00:33:15 +01:00
return {
listUsersGroup,
listgroups,
listSentRequestGroups,
listRefusedGroups,
mygroups: req.user.profile.mygroups,
2022-02-03 00:33:15 +01:00
};
} catch (e) {
console.log('Error', e);
}
return {
listUsersGroup: [],
listRequestUsersGroup: [],
listTrusted: [],
listSentRequestGroups: [],
listRefusedGroups: [],
2022-02-03 00:33:15 +01:00
};
};
2023-01-03 16:51:32 +01:00
MyGroupSchema.statics.extractCitiesName = async function (idapp, id) {
try {
let aggr1 = [
{
2023-01-03 16:51:32 +01:00
$match: { idapp, _id: id },
},
{
$lookup: {
from: 'cities',
localField: 'idCity',
foreignField: '_id',
as: 'mycities',
},
},
{
'$replaceRoot': {
'newRoot': {
'$mergeObjects': [
{
'$arrayElemAt': [
'$mycities',
0,
],
},
'$$ROOT',
],
},
},
},
{
$project: {
"mycities.comune": 1,
"mycities.prov": 1
},
},
];
ris = await this.aggregate(aggr1);
return ris;
2023-01-03 16:51:32 +01:00
} catch (e) {
console.error('e', e);
}
};
2023-01-03 16:51:32 +01:00
MyGroupSchema.statics.ifCircuitAlreadyInGroup = async function (idapp, groupname, circuitname) {
// Controllo se è stato già inserito il circuito sul gruppo
return await this.findOne({
idapp,
groupname,
'mycircuits': {
$elemMatch: { circuitname: { $eq: circuitname } },
},
}).lean();
};
// aggiungo il Circuito all'interno del Gruppo
MyGroupSchema.statics.addCircuitFromGroup = async function (idapp, groupname, circuitname) {
return await this.updateOne({ idapp, groupname },
{ $push: { 'mycircuits': {
circuitname,
date: new Date(),
} } });
};
// Rimuovo il Circuito all'interno del Gruppo
MyGroupSchema.statics.removeCircuitFromGroup = async function (idapp, groupname, circuitname) {
return await this.updateOne({ idapp, groupname },
{ $pull: { 'mycircuits': { circuitname: { $in: [circuitname] } } } });
};
2022-02-03 00:33:15 +01:00
const MyGroup = mongoose.model('MyGroup', MyGroupSchema);
2023-01-03 16:51:32 +01:00
module.exports = { MyGroup };