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

feat(structureTypes): new structure types list

parent 79769428
No related branches found
No related tags found
2 merge requests!345V2.4.2,!343365-type-de-structure-nouvelle-liste
import { Db } from 'mongodb';
import { getDb } from '../migrations-utils/db';
export const up = async () => {
try {
const db: Db = await getDb();
// Maison du Rhône will become the new type "administration"
await db
.collection('structuretype')
.findOneAndUpdate({ value: 'Maison du Rhône' }, { $set: { value: 'administration' } });
// Mapping of old values to new values
const mapping = [
{ value: 'bijPij', newValue: 'sij' },
{ value: 'CAF', newValue: 'administration' },
{ value: 'CARSAT', newValue: 'administration' },
{ value: 'CPAM', newValue: 'administration' },
{ value: 'centreDeGestion', newValue: 'administration' },
{ value: 'prefecture', newValue: 'administration' },
{ value: 'poleEmploi', newValue: 'administration' },
{ value: 'CCAS', newValue: 'mairie' },
];
for (const map of mapping) {
// Find the old and new _id for the given value
const newStructureType = await db.collection('structuretype').findOne({ value: map.newValue });
const oldStructureType = await db.collection('structuretype').findOne({ value: map.value });
// Update the "structures" collection with the new _id for structureType
if (oldStructureType && newStructureType) {
await db
.collection('structures')
.updateMany({ structureType: oldStructureType._id }, { $set: { structureType: newStructureType._id } });
}
// Delete the old "structureType" documents
await db.collection('structuretype').deleteMany({ value: map.value });
}
// Remove two other obsolete structure types and empty their references in the structure collection
const toDelete = [{ value: 'EPIC' }, { value: 'MaisonFranceService' }];
for (const del of toDelete) {
// Find the _id
const structureType = await db.collection('structuretype').findOne({ value: del.value });
// Remove the structureType id from the "structures" collection and delete the obsolete structureType
if (structureType) {
await db
.collection('structures')
.updateMany({ structureType: structureType._id }, { $set: { structureType: null } });
await db.collection('structuretype').deleteOne({ _id: structureType._id });
}
}
// Add full names in database
const nameMapping = [
{ value: 'administration', name: 'Administration' },
{ value: 'formation', name: 'Structure de formation' },
{ value: 'sij', name: 'Structure information jeunesse' },
{ value: 'espaceEmploi', name: 'Espace emploi' },
{ value: 'laPoste', name: 'La Poste' },
{ value: 'mediatheque', name: 'Médiathèque/Bibliothèque' },
{ value: 'logement', name: 'Bailleur social' },
{ value: 'association', name: 'Association' },
{ value: 'insertion', name: "Structure d'insertion" },
{ value: 'centreSocio', name: 'Centre socio-culturel' },
{ value: 'AFPA', name: 'Organisme public de formation' },
{ value: 'mairie', name: 'Mairie' },
{ value: 'mjc', name: 'MJC' },
{ value: 'missionsLocales', name: 'Mission locale' },
{ value: 'Communauté de communes', name: 'Communauté de communes' },
{ value: 'mdm', name: 'Maison de la Métropole de Lyon' },
{ value: 'Université', name: 'Université' },
{ value: 'autre', name: 'Autre' },
];
// Add name field to structure types
for (const nameMap of nameMapping) {
await db.collection('structuretype').updateMany({ value: nameMap.value }, { $set: { name: nameMap.name } });
}
// Keep the "value" field because it is useful for elastic search to find a structure type with another search string (ex if value='mdml toto' then 'mdml' or 'toto' = maison de la métropole de lyon)
// Change value from mdm to mdml so that searches with 'mdm 'and 'mdml' both show structures with structureType name 'Maison de la Métropole de Lyon'
await db.collection('structuretype').updateOne({ value: 'mdm' }, { $set: { value: 'mdml' } });
console.log('Updated : "StructureType" collection updated');
} catch (error) {
console.error('Error updating documents:', error);
}
};
export const down = async () => {
try {
const db: Db = await getDb();
await db.collection('structuretype').drop();
await db.collection('structuretype').insertMany([
{ category: 'Publique', value: 'mairie', selectable: 'true' },
{ category: 'Publique', value: 'CAF', selectable: 'true' },
{ category: 'Publique', value: 'CCAS', selectable: 'true' },
{ category: 'Publique', value: 'CARSAT', selectable: 'true' },
{ category: 'Publique', value: 'poleEmploi', selectable: 'true' },
{ category: 'Publique', value: 'mdml', selectable: 'true' },
{ category: 'Publique', value: 'mediatheque', selectable: 'true' },
{ category: 'Publique', value: 'prefecture', selectable: 'true' },
{ category: 'Publique', value: 'bijPij', selectable: 'true' },
{ category: 'Publique', value: 'logement', selectable: 'true' },
{ category: 'Publique', value: 'MaisonFranceService', selectable: 'true' },
{ category: 'Publique', value: 'autre', selectable: 'false' },
{ category: 'Publique', value: 'laPoste', selectable: 'true' },
{ category: 'Publique', value: 'espaceEmploi', selectable: 'true' },
{ category: 'Publique', value: 'CPAM', selectable: 'true' },
{ category: 'Publique', value: 'AFPA', selectable: 'true' },
{ category: 'Publique', value: 'centreDeGestion', selectable: 'true' },
{ category: 'Publique', value: 'EPIC', selectable: 'true' },
{ category: 'Publique', value: 'Communauté de communes', selectable: 'true' },
{ category: 'Publique', value: 'Maison du Rhône', selectable: 'true' },
{ category: 'Publique', value: 'Université', selectable: 'true' },
{ category: 'Privée à but non lucratif', value: 'association', selectable: 'true' },
{ category: 'Privée à but non lucratif', value: 'centreSocio', selectable: 'true' },
{ category: 'Privée à but non lucratif', value: 'mjc', selectable: 'true' },
{ category: 'Privée à but non lucratif', value: 'sij', selectable: 'true' },
{ category: 'Privée à but non lucratif', value: 'missionsLocales', selectable: 'true' },
{ category: 'Privée à but lucratif', value: 'formation', selectable: 'true' },
{ category: 'Privée à but lucratif', value: 'insertion', selectable: 'true' },
]);
console.log('Downgrade : old structure types have been restored (but not attached to the appropriate structures)');
} catch (error) {
console.error('Error downgrading documents:', error);
}
};
......@@ -3,7 +3,8 @@ import { Address } from '../schemas/address.schema';
export interface StructureSearchBody {
structureId: string;
structureName: string;
structureType: string;
structureTypeName: string;
structureTypeValue: string;
address: Address;
description: string;
}
......@@ -30,7 +30,8 @@ export class StructuresSearchService {
private formatIndexBody(structure: StructureDocument): StructureSearchBody {
return {
structureName: structure.structureName,
structureType: structure.structureType?.value,
structureTypeName: structure.structureType?.name,
structureTypeValue: structure.structureType?.value,
structureId: structure._id,
address: structure.address,
description: structure.description,
......@@ -111,7 +112,14 @@ export class StructuresSearchService {
query: escapeElasticsearchQuery(searchString),
fields: fields
? fields
: ['structureName^5', 'structureType^5', 'address.commune^10', 'address.postcode^5', 'description'],
: [
'structureName^5',
'structureTypeName^5',
'structureTypeValue^5',
'address.commune^10',
'address.postcode^5',
'description',
],
fuzziness: 'AUTO',
},
},
......
......@@ -11,6 +11,9 @@ export class StructureType {
@Prop()
value: string;
@Prop()
name: string;
// Boolean set to false if user can't select this type during structure creation
@Prop()
selectable: boolean;
......
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