Skip to content
Snippets Groups Projects
Commit 9bb4e554 authored by Marlène SIMONDANT's avatar Marlène SIMONDANT
Browse files

feat(script) : extract some data for the PO

parent acb3f77d
No related branches found
No related tags found
No related merge requests found
const mongoose = require('mongoose');
require('dotenv').config();
// MongoDB connection parameters
const param =
'mongodb://' +
process.env.MONGO_NON_ROOT_USERNAME +
':' +
process.env.MONGO_NON_ROOT_PASSWORD +
'@' +
process.env.MONGO_DB_HOST_AND_PORT +
'/ram';
// Define the user schema
const userSchema = mongoose.Schema({
structuresLink: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Structure' }],
job: { type: mongoose.Schema.Types.ObjectId, ref: 'Job' },
});
// Define the models
const User = mongoose.model('User', userSchema);
let connection;
async function connectToMongoDB() {
try {
connection = await mongoose.connect(param, { useNewUrlParser: true, useUnifiedTopology: true });
console.log('Connected to MongoDB');
} catch (error) {
console.error('Error connecting to MongoDB:', error);
throw error;
}
}
async function disconnectFromMongoDB() {
try {
await connection.disconnect();
console.log('Disconnected from MongoDB');
} catch (error) {
console.error('Error disconnecting from MongoDB:', error);
throw error;
}
}
async function countUsersLinkedToLyonStructuresWithPersonalOffer(district) {
let uniqueUsers = new Set();
let uniqueUserNames = new Set();
let uniqueStructureNames = new Set();
try {
// Count users who work in Lyon structures with personal offers associated with this structure in Lyon
const lyonUsers = await User.aggregate([
{
$lookup: {
from: 'jobs',
localField: 'job',
foreignField: '_id',
as: 'userJob',
},
},
{
$match: {
'userJob.hasPersonalOffer': true,
},
},
{
$lookup: {
from: 'structures',
localField: 'structuresLink',
foreignField: '_id',
as: 'linkedStructures',
},
},
{
$unwind: '$linkedStructures', // Unwind the structures array
},
{
$match: {
$or: [
{ 'linkedStructures.address.commune': { $regex: new RegExp(`^Lyon ${district}`, 'i') } },
{ 'linkedStructures.address.postcode': { $regex: new RegExp(`^6900${district}`, 'i') } },
],
},
},
{
$group: {
_id: '$_id', // Group by user ID to ensure each user is counted once per district
name: { $first: '$name' },
surname: { $first: '$surname' },
structureNames: { $addToSet: '$linkedStructures.structureName' },
},
},
]);
lyonUsers.forEach((user) => {
uniqueUsers.add(user._id); // Add unique user to set
uniqueUserNames.add(user.name + ' ' + user.surname);
});
lyonUsers.forEach((user) => {
user.structureNames.forEach((structureName) => {
uniqueStructureNames.add(structureName);
});
});
console.log(`LYON ${district}: ${uniqueUsers.size} utilisateur(s) et ${uniqueStructureNames.size} structure(s)`);
console.log('Utilisateur(s) :');
uniqueUserNames.forEach((name) => console.log('- ' + name));
console.log('Structure(s) :');
uniqueStructureNames.forEach((name) => console.log('- ' + name));
console.log('\n');
} catch (error) {
console.error(`Error counting users who work in Lyon ${district} structures and have personal offers : `, error);
}
return uniqueUsers;
}
async function countTotalUniqueUsersAcrossDistricts() {
let totalUniqueUsers = new Set();
try {
await connectToMongoDB();
// info message
console.log(
"> 'Utilisateur(s)' = le nombre d’utilisateurs dans la catégorie de fonction « Accompagnement numérique » et dont au moins 1 structure d'intervention est située à Lyon"
);
console.log(
"> 'Structures(s)'= le nombre de structures situées à Lyon qui ont au moins 1 membre dans la catégorie de fonction « Accompagnement numérique » \n"
);
for (let district = 1; district <= 9; district++) {
const uniqueUsers = await countUsersLinkedToLyonStructuresWithPersonalOffer(district);
uniqueUsers.forEach((user) => {
if (!totalUniqueUsers.has(user._id.toString())) {
totalUniqueUsers.add(user.toString()); // Add unique user to total set
}
});
}
await countUsersLinkedToLyonStructuresWithPersonalOffer('');
} catch (error) {
console.error('Error counting total unique users across all Lyon districts:', error);
} finally {
await disconnectFromMongoDB();
}
}
// Call the function to count total unique users and structures across all districts
countTotalUniqueUsersAcrossDistricts();
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment