From b048cfb1a0c03855e21bbd27dd0409bfb303f2ad Mon Sep 17 00:00:00 2001 From: Sosthene Date: Mon, 21 Jul 2025 14:03:57 +0200 Subject: [PATCH 01/15] Check for `deleted`, not `statutDuRattachement` when updating user --- src/services/common/IdNotService/IdNotService.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/services/common/IdNotService/IdNotService.ts b/src/services/common/IdNotService/IdNotService.ts index deeb732f..eca2b5d5 100644 --- a/src/services/common/IdNotService/IdNotService.ts +++ b/src/services/common/IdNotService/IdNotService.ts @@ -50,6 +50,7 @@ interface IRattachementData { numeroTelephone: string; statutDuRattachement: boolean; mailRattachement: string; + deleted: boolean; } interface IOfficeData { @@ -241,12 +242,12 @@ export default class IdNotService extends BaseService { return; } - if (!userData.statutDuRattachement) { + if (userData.deleted) { let rattachements: any; try { rattachements = (await ( - await fetch(`${this.variables.IDNOT_API_BASE_URL}/api/pp/v2/personnes/${user.idNot}/rattachements?` + searchParams, { + await fetch(`${this.variables.IDNOT_API_BASE_URL}/api/pp/v2/personnes/${user.idNot}/rattachements?deleted=false` + searchParams, { method: "GET", }) ).json()) as any; @@ -256,14 +257,14 @@ export default class IdNotService extends BaseService { } if (rattachements.totalResultCount === 0) { + console.warn("User has no valid rattachements", user.uid); await this.userService.updateCheckedAt(user.uid!); - //await this.userService.delete(user.uid!); return; } const rattachementsResults = rattachements.result as IRattachementData[]; if (!rattachementsResults) return; rattachementsResults.forEach(async (rattachement) => { - if (rattachement.statutDuRattachement) { + if (rattachement.statutDuRattachement && !rattachement.deleted) { let officeData: IOfficeData; try { From 05191577eba26ba9a700c29f4f9cc2f270bdbfa2 Mon Sep 17 00:00:00 2001 From: Omar Oughriss Date: Mon, 21 Jul 2025 16:48:11 +0200 Subject: [PATCH 02/15] Add updateUser method verbosity --- src/services/common/IdNotService/IdNotService.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/services/common/IdNotService/IdNotService.ts b/src/services/common/IdNotService/IdNotService.ts index eca2b5d5..250713cc 100644 --- a/src/services/common/IdNotService/IdNotService.ts +++ b/src/services/common/IdNotService/IdNotService.ts @@ -287,6 +287,11 @@ export default class IdNotService extends BaseService { let updates = 0; + console.log("userData", userData); + console.log("user", user); + console.log("user.office_membership!.idNot", user.office_membership!.idNot); + console.log("userData.entite.ou", userData.entite.ou); + if (user.office_membership!.idNot !== userData.entite.ou) { updates++; let officeData = (await this.officeService.get({ where: { idNot: userData.entite.ou } }))[0]; From f3d9f3e6c8ccd40017e55528f7262df3d2b0f851 Mon Sep 17 00:00:00 2001 From: Omar Oughriss Date: Mon, 21 Jul 2025 17:06:19 +0200 Subject: [PATCH 03/15] Update verbosity --- src/services/common/IdNotService/IdNotService.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/services/common/IdNotService/IdNotService.ts b/src/services/common/IdNotService/IdNotService.ts index 250713cc..9ac353f6 100644 --- a/src/services/common/IdNotService/IdNotService.ts +++ b/src/services/common/IdNotService/IdNotService.ts @@ -242,6 +242,8 @@ export default class IdNotService extends BaseService { return; } + console.log("First userData", userData); + if (userData.deleted) { let rattachements: any; @@ -287,10 +289,9 @@ export default class IdNotService extends BaseService { let updates = 0; - console.log("userData", userData); - console.log("user", user); - console.log("user.office_membership!.idNot", user.office_membership!.idNot); - console.log("userData.entite.ou", userData.entite.ou); + console.log("Second userData", userData); + console.log("BDD user", user); + if (user.office_membership!.idNot !== userData.entite.ou) { updates++; From 497ff05ab1beca453b725bbb95bb26368f593ab1 Mon Sep 17 00:00:00 2001 From: Omar Oughriss Date: Mon, 21 Jul 2025 17:29:16 +0200 Subject: [PATCH 04/15] Stringify logs --- src/services/common/IdNotService/IdNotService.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/services/common/IdNotService/IdNotService.ts b/src/services/common/IdNotService/IdNotService.ts index 9ac353f6..4e22695f 100644 --- a/src/services/common/IdNotService/IdNotService.ts +++ b/src/services/common/IdNotService/IdNotService.ts @@ -222,6 +222,7 @@ export default class IdNotService extends BaseService { public async updateUser(userId: string) { const userInfos = await this.userService.getByUid(userId, { contact: true, role: true, office_membership: true }); const user = User.hydrate(userInfos!); + console.log("Got user from db:", JSON.stringify(user)); const searchParams = new URLSearchParams({ key: this.variables.IDNOT_API_KEY, }); @@ -238,11 +239,11 @@ export default class IdNotService extends BaseService { ) ).json()) as IRattachementData; } catch (error) { - console.error("Error fetching user data", error); + console.error(`Error fetching user data for ${user.uid}: ${error}`); return; } - console.log("First userData", userData); + console.log("Got userData from idnot", JSON.stringify(userData)); if (userData.deleted) { let rattachements: any; @@ -282,6 +283,7 @@ export default class IdNotService extends BaseService { if (officeData.typeEntite.name === "office") { userData = rattachement; + console.log("Updated userData", JSON.stringify(userData)); } } }); @@ -289,9 +291,6 @@ export default class IdNotService extends BaseService { let updates = 0; - console.log("Second userData", userData); - console.log("BDD user", user); - if (user.office_membership!.idNot !== userData.entite.ou) { updates++; @@ -366,9 +365,6 @@ export default class IdNotService extends BaseService { return; } const officeData = (await officeRawData.json()) as IOfficeData; - console.log("office", office); - - console.log("officeData", officeData); let updates = 0; //093051 = demo @@ -380,6 +376,7 @@ export default class IdNotService extends BaseService { updates++; office.office_status = this.getOfficeStatus(officeData.statutEntite.name); } + console.log(`Updating office: ${office.uid} - ${office.name} - ${office.crpcen}`); if (updates != 0) await this.officeService.update(office.uid!, office); await this.officeService.updateCheckedAt(office.uid!); } @@ -556,6 +553,7 @@ export default class IdNotService extends BaseService { public async updateOffices() { const officesReq = await this.officeService.getOfficesToBeChecked(); const offices = Office.hydrateArray(officesReq); + console.log(`Updating ${offices.length} offices`); offices.forEach(async (office) => { await this.updateOffice(office.uid!); }); From 2435fb53b0086205c1a416401dc212c77c1d98e1 Mon Sep 17 00:00:00 2001 From: Sosthene Date: Tue, 22 Jul 2025 14:48:04 +0200 Subject: [PATCH 05/15] Handle raw response from idnot --- .../common/IdNotService/IdNotService.ts | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/services/common/IdNotService/IdNotService.ts b/src/services/common/IdNotService/IdNotService.ts index 4e22695f..44a63573 100644 --- a/src/services/common/IdNotService/IdNotService.ts +++ b/src/services/common/IdNotService/IdNotService.ts @@ -227,21 +227,29 @@ export default class IdNotService extends BaseService { key: this.variables.IDNOT_API_KEY, }); - let userData: IRattachementData; + let userRawData: Response; try { - userData = (await ( - await fetch( + userRawData = await fetch( `${this.variables.IDNOT_API_BASE_URL}/api/pp/v2/rattachements/${user.idNot}_${user.office_membership!.idNot}?` + searchParams, { method: "GET", }, ) - ).json()) as IRattachementData; } catch (error) { console.error(`Error fetching user data for ${user.uid}: ${error}`); return; } + + if (userRawData.status === 404) { + console.error(`User ${user.uid} not found in idnot`); + return; + } else if (userRawData.status !== 200) { + console.error(`Error fetching user data for ${user.uid}: ${userRawData.status} - ${userRawData.statusText}`); + return; + } + + let userData = (await userRawData.json()) as IRattachementData; console.log("Got userData from idnot", JSON.stringify(userData)); @@ -249,16 +257,22 @@ export default class IdNotService extends BaseService { let rattachements: any; try { - rattachements = (await ( - await fetch(`${this.variables.IDNOT_API_BASE_URL}/api/pp/v2/personnes/${user.idNot}/rattachements?deleted=false` + searchParams, { - method: "GET", - }) - ).json()) as any; + rattachements = await fetch(`${this.variables.IDNOT_API_BASE_URL}/api/pp/v2/personnes/${user.idNot}/rattachements?deleted=false` + searchParams, { + method: "GET", + }); } catch (error) { console.error("Error fetching rattachements", error); return; } + if (rattachements.status === 404) { + console.error(`User ${user.uid} not found in idnot`); + return; + } else if (rattachements.status !== 200) { + console.error(`Error fetching rattachements for ${user.uid}: ${rattachements.status} - ${rattachements.statusText}`); + return; + } + if (rattachements.totalResultCount === 0) { console.warn("User has no valid rattachements", user.uid); await this.userService.updateCheckedAt(user.uid!); From b2dfb98f2b5ed45eed13307e4cf5688e75a4ab89 Mon Sep 17 00:00:00 2001 From: Sosthene Date: Tue, 22 Jul 2025 15:37:56 +0200 Subject: [PATCH 06/15] more verbosity --- src/services/common/IdNotService/IdNotService.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/services/common/IdNotService/IdNotService.ts b/src/services/common/IdNotService/IdNotService.ts index 44a63573..fec3a9c8 100644 --- a/src/services/common/IdNotService/IdNotService.ts +++ b/src/services/common/IdNotService/IdNotService.ts @@ -256,6 +256,8 @@ export default class IdNotService extends BaseService { if (userData.deleted) { let rattachements: any; + console.log("Fetching rattachements for user", user.uid); + console.log(searchParams.toString()); try { rattachements = await fetch(`${this.variables.IDNOT_API_BASE_URL}/api/pp/v2/personnes/${user.idNot}/rattachements?deleted=false` + searchParams, { method: "GET", @@ -383,14 +385,17 @@ export default class IdNotService extends BaseService { let updates = 0; //093051 = demo if (office.name !== officeData.denominationSociale && office.name !== officeData.codeCrpcen && office.crpcen !== "029178" && office.crpcen !== "035010" && office.crpcen !== "093051") { + console.log(`Updating office name: ${office.uid} - ${office.name} - ${office.crpcen}`); updates++; office.name = officeData.denominationSociale ?? officeData.codeCrpcen; + console.log(`New name: ${office.name}`); } if (office.office_status !== this.getOfficeStatus(officeData.statutEntite.name)) { + console.log(`Updating office status: ${office.uid} - ${office.name} - ${office.crpcen}`); updates++; office.office_status = this.getOfficeStatus(officeData.statutEntite.name); + console.log(`New status: ${office.office_status}`); } - console.log(`Updating office: ${office.uid} - ${office.name} - ${office.crpcen}`); if (updates != 0) await this.officeService.update(office.uid!, office); await this.officeService.updateCheckedAt(office.uid!); } From 363c16847938721f6599232ca801550c6814cf91 Mon Sep 17 00:00:00 2001 From: Sosthene Date: Wed, 23 Jul 2025 12:58:58 +0200 Subject: [PATCH 07/15] Fix url --- src/services/common/IdNotService/IdNotService.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/common/IdNotService/IdNotService.ts b/src/services/common/IdNotService/IdNotService.ts index fec3a9c8..a3e6e46d 100644 --- a/src/services/common/IdNotService/IdNotService.ts +++ b/src/services/common/IdNotService/IdNotService.ts @@ -259,7 +259,7 @@ export default class IdNotService extends BaseService { console.log("Fetching rattachements for user", user.uid); console.log(searchParams.toString()); try { - rattachements = await fetch(`${this.variables.IDNOT_API_BASE_URL}/api/pp/v2/personnes/${user.idNot}/rattachements?deleted=false` + searchParams, { + rattachements = await fetch(`${this.variables.IDNOT_API_BASE_URL}/api/pp/v2/personnes/${user.idNot}/rattachements?` + searchParams, { method: "GET", }); } catch (error) { @@ -281,6 +281,7 @@ export default class IdNotService extends BaseService { return; } const rattachementsResults = rattachements.result as IRattachementData[]; + console.log("rattachementsResults", JSON.stringify(rattachementsResults)); if (!rattachementsResults) return; rattachementsResults.forEach(async (rattachement) => { if (rattachement.statutDuRattachement && !rattachement.deleted) { From 4fdd163c9051e4fe67a0719e62dfbae85b1bee7a Mon Sep 17 00:00:00 2001 From: Sosthene Date: Wed, 23 Jul 2025 13:23:54 +0200 Subject: [PATCH 08/15] Fix updateUser res parsing --- .../common/IdNotService/IdNotService.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/services/common/IdNotService/IdNotService.ts b/src/services/common/IdNotService/IdNotService.ts index a3e6e46d..c8170d48 100644 --- a/src/services/common/IdNotService/IdNotService.ts +++ b/src/services/common/IdNotService/IdNotService.ts @@ -257,23 +257,24 @@ export default class IdNotService extends BaseService { let rattachements: any; console.log("Fetching rattachements for user", user.uid); - console.log(searchParams.toString()); try { - rattachements = await fetch(`${this.variables.IDNOT_API_BASE_URL}/api/pp/v2/personnes/${user.idNot}/rattachements?` + searchParams, { + const res = await fetch(`${this.variables.IDNOT_API_BASE_URL}/api/pp/v2/personnes/${user.idNot}/rattachements?` + searchParams, { method: "GET", }); + if (res.status === 404) { + console.error(`User ${user.uid} not found in idnot`); + return; + } else if (res.status !== 200) { + console.error(`Error fetching rattachements for ${user.uid}: ${rattachements.status} - ${rattachements.statusText}`); + return; + } + + rattachements = await res.json(); } catch (error) { console.error("Error fetching rattachements", error); return; } - if (rattachements.status === 404) { - console.error(`User ${user.uid} not found in idnot`); - return; - } else if (rattachements.status !== 200) { - console.error(`Error fetching rattachements for ${user.uid}: ${rattachements.status} - ${rattachements.statusText}`); - return; - } if (rattachements.totalResultCount === 0) { console.warn("User has no valid rattachements", user.uid); From 51c7c08c532c09ad0c3f890e1516721b9d15e4f4 Mon Sep 17 00:00:00 2001 From: Sosthene Date: Wed, 23 Jul 2025 16:12:33 +0200 Subject: [PATCH 09/15] Updated userData includes office --- src/services/common/IdNotService/IdNotService.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/services/common/IdNotService/IdNotService.ts b/src/services/common/IdNotService/IdNotService.ts index c8170d48..309eb245 100644 --- a/src/services/common/IdNotService/IdNotService.ts +++ b/src/services/common/IdNotService/IdNotService.ts @@ -299,8 +299,11 @@ export default class IdNotService extends BaseService { return; } + console.log("officeData", JSON.stringify(officeData)); + if (officeData.typeEntite.name === "office") { userData = rattachement; + userData.entite = officeData; console.log("Updated userData", JSON.stringify(userData)); } } @@ -309,7 +312,6 @@ export default class IdNotService extends BaseService { let updates = 0; - if (user.office_membership!.idNot !== userData.entite.ou) { updates++; let officeData = (await this.officeService.get({ where: { idNot: userData.entite.ou } }))[0]; @@ -345,15 +347,18 @@ export default class IdNotService extends BaseService { officeData = await this.officeService.create(office); } user.office_membership = officeData; + console.log("Updated user.office_membership", JSON.stringify(user.office_membership)); } if (user.contact!.email !== userData.mailRattachement) { updates++; user.contact!.email = userData.mailRattachement; + console.log("Updated user.contact.email", JSON.stringify(user.contact!.email)); } if (user.contact!.cell_phone_number !== userData.numeroMobile) { updates++; user.contact!.cell_phone_number = userData.numeroMobile; + console.log("Updated user.contact.cell_phone_number", JSON.stringify(user.contact!.cell_phone_number)); } if (updates != 0) await this.userService.update(user.uid!, user); await this.userService.updateCheckedAt(user.uid!); From c3c6185d9d24a817fb25801472d23dead0a35b5d Mon Sep 17 00:00:00 2001 From: Sosthene Date: Wed, 23 Jul 2025 17:17:52 +0200 Subject: [PATCH 10/15] more verbosity --- src/common/repositories/UsersRepository.ts | 1 + src/services/common/IdNotService/IdNotService.ts | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/common/repositories/UsersRepository.ts b/src/common/repositories/UsersRepository.ts index 4dc65708..606700c9 100644 --- a/src/common/repositories/UsersRepository.ts +++ b/src/common/repositories/UsersRepository.ts @@ -90,6 +90,7 @@ export default class UsersRepository extends BaseRepository { */ public async update(uid: string, user: User): Promise { + console.log("Updating user", JSON.stringify(user)); const updateArgs: Prisma.UsersUpdateArgs = { where: { uid: uid, diff --git a/src/services/common/IdNotService/IdNotService.ts b/src/services/common/IdNotService/IdNotService.ts index 309eb245..9bdbc4d3 100644 --- a/src/services/common/IdNotService/IdNotService.ts +++ b/src/services/common/IdNotService/IdNotService.ts @@ -275,11 +275,14 @@ export default class IdNotService extends BaseService { return; } + console.log("rattachements", JSON.stringify(rattachements)); - if (rattachements.totalResultCount === 0) { + if (rattachements && rattachements.totalResultCount === 0 && rattachements.result.length === 0) { console.warn("User has no valid rattachements", user.uid); await this.userService.updateCheckedAt(user.uid!); return; + } else { + console.log(`Found ${rattachements.totalResultCount} rattachements for ${user.uid}`); } const rattachementsResults = rattachements.result as IRattachementData[]; console.log("rattachementsResults", JSON.stringify(rattachementsResults)); @@ -312,9 +315,14 @@ export default class IdNotService extends BaseService { let updates = 0; + console.log("user.office_membership.idNot", JSON.stringify(user.office_membership!.idNot)); + console.log("userData.entite.ou", JSON.stringify(userData.entite.ou)); + if (user.office_membership!.idNot !== userData.entite.ou) { + console.log("Updating user.office_membership"); updates++; let officeData = (await this.officeService.get({ where: { idNot: userData.entite.ou } }))[0]; + console.log("officeData", JSON.stringify(officeData)); if (!officeData) { let officeLocationData: IOfficeLocation; @@ -360,6 +368,7 @@ export default class IdNotService extends BaseService { user.contact!.cell_phone_number = userData.numeroMobile; console.log("Updated user.contact.cell_phone_number", JSON.stringify(user.contact!.cell_phone_number)); } + console.log("updates", updates); if (updates != 0) await this.userService.update(user.uid!, user); await this.userService.updateCheckedAt(user.uid!); } From 5afa9d9a871bf89910dcbb74e94069f4a2606bc9 Mon Sep 17 00:00:00 2001 From: Sosthene Date: Wed, 23 Jul 2025 20:02:14 +0200 Subject: [PATCH 11/15] Fix async issue --- src/services/common/IdNotService/IdNotService.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/services/common/IdNotService/IdNotService.ts b/src/services/common/IdNotService/IdNotService.ts index 9bdbc4d3..c14eae58 100644 --- a/src/services/common/IdNotService/IdNotService.ts +++ b/src/services/common/IdNotService/IdNotService.ts @@ -285,10 +285,11 @@ export default class IdNotService extends BaseService { console.log(`Found ${rattachements.totalResultCount} rattachements for ${user.uid}`); } const rattachementsResults = rattachements.result as IRattachementData[]; - console.log("rattachementsResults", JSON.stringify(rattachementsResults)); if (!rattachementsResults) return; - rattachementsResults.forEach(async (rattachement) => { + + for (const rattachement of rattachementsResults) { if (rattachement.statutDuRattachement && !rattachement.deleted) { + console.log("rattachementsResults", JSON.stringify(rattachementsResults)); let officeData: IOfficeData; try { @@ -299,7 +300,7 @@ export default class IdNotService extends BaseService { ).json()) as IOfficeData; } catch (error) { console.error("Error fetching office data", error); - return; + continue; } console.log("officeData", JSON.stringify(officeData)); @@ -308,9 +309,10 @@ export default class IdNotService extends BaseService { userData = rattachement; userData.entite = officeData; console.log("Updated userData", JSON.stringify(userData)); + break; // Found the first valid office, no need to continue } } - }); + } } let updates = 0; From 86b81258b6477088f8c298763ba976f468a64004 Mon Sep 17 00:00:00 2001 From: Sosthene Date: Wed, 23 Jul 2025 22:59:25 +0200 Subject: [PATCH 12/15] Fix null values with prisma --- src/common/repositories/UsersRepository.ts | 8 +++-- .../common/IdNotService/IdNotService.ts | 34 +++++++++++++++---- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/common/repositories/UsersRepository.ts b/src/common/repositories/UsersRepository.ts index 606700c9..f5e25b83 100644 --- a/src/common/repositories/UsersRepository.ts +++ b/src/common/repositories/UsersRepository.ts @@ -101,9 +101,9 @@ export default class UsersRepository extends BaseRepository { update: { first_name: user.contact?.first_name, last_name: user.contact?.last_name, - email: user.contact?.email, - phone_number: user.contact?.phone_number, - cell_phone_number: user.contact?.cell_phone_number, + email: user.contact?.email === null ? undefined : user.contact?.email, + phone_number: user.contact?.phone_number === null ? undefined : user.contact?.phone_number, + cell_phone_number: user.contact?.cell_phone_number === null ? undefined : user.contact?.cell_phone_number, civility: ECivility[user.contact?.civility as keyof typeof ECivility], }, }, @@ -142,6 +142,8 @@ export default class UsersRepository extends BaseRepository { }; } + console.log("updateArgs", JSON.stringify(updateArgs)); + return this.model.update({ ...updateArgs, include: { contact: true, office_membership: { include: { address: true } } } }); } diff --git a/src/services/common/IdNotService/IdNotService.ts b/src/services/common/IdNotService/IdNotService.ts index c14eae58..7eaa9b63 100644 --- a/src/services/common/IdNotService/IdNotService.ts +++ b/src/services/common/IdNotService/IdNotService.ts @@ -370,8 +370,11 @@ export default class IdNotService extends BaseService { user.contact!.cell_phone_number = userData.numeroMobile; console.log("Updated user.contact.cell_phone_number", JSON.stringify(user.contact!.cell_phone_number)); } - console.log("updates", updates); - if (updates != 0) await this.userService.update(user.uid!, user); + if (updates != 0) { + // Filter out null values before updating to prevent Prisma errors + const convertedUser = this.convertNullToUndefined(user); + await this.userService.update(user.uid!, convertedUser); + } await this.userService.updateCheckedAt(user.uid!); } @@ -582,17 +585,36 @@ export default class IdNotService extends BaseService { public async updateUsers() { const usersReq = await this.userService.getUsersToBeChecked(); const users = User.hydrateArray(usersReq); - users.forEach(async (user) => { + for (const user of users) { await this.updateUser(user.uid!); - }); + } } public async updateOffices() { const officesReq = await this.officeService.getOfficesToBeChecked(); const offices = Office.hydrateArray(officesReq); console.log(`Updating ${offices.length} offices`); - offices.forEach(async (office) => { + for (const office of offices) { await this.updateOffice(office.uid!); - }); + } + } + + /** + * Utility function to convert null values to undefined + * This prevents Prisma from throwing errors about null values + */ + private convertNullToUndefined>(obj: T): T { + const converted = { ...obj }; + + for (const [key, value] of Object.entries(converted)) { + if (value === null) { + console.log(`Converting null to undefined for key: ${key}`); + (converted as any)[key] = undefined; + } else if (typeof value === 'object' && !Array.isArray(value)) { + (converted as any)[key] = this.convertNullToUndefined(value); + } + } + + return converted; } } From e46739befe1ac92a2b9938a9550573bb1fc84c26 Mon Sep 17 00:00:00 2001 From: Sosthene Date: Thu, 24 Jul 2025 00:03:49 +0200 Subject: [PATCH 13/15] Don't trigger updateUser on missing email/phone --- .../common/IdNotService/IdNotService.ts | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/services/common/IdNotService/IdNotService.ts b/src/services/common/IdNotService/IdNotService.ts index 7eaa9b63..3b7cfaee 100644 --- a/src/services/common/IdNotService/IdNotService.ts +++ b/src/services/common/IdNotService/IdNotService.ts @@ -315,16 +315,12 @@ export default class IdNotService extends BaseService { } } - let updates = 0; - - console.log("user.office_membership.idNot", JSON.stringify(user.office_membership!.idNot)); - console.log("userData.entite.ou", JSON.stringify(userData.entite.ou)); + let update = false; if (user.office_membership!.idNot !== userData.entite.ou) { console.log("Updating user.office_membership"); - updates++; + update = true; let officeData = (await this.officeService.get({ where: { idNot: userData.entite.ou } }))[0]; - console.log("officeData", JSON.stringify(officeData)); if (!officeData) { let officeLocationData: IOfficeLocation; @@ -360,17 +356,17 @@ export default class IdNotService extends BaseService { console.log("Updated user.office_membership", JSON.stringify(user.office_membership)); } - if (user.contact!.email !== userData.mailRattachement) { - updates++; + if (userData.mailRattachement && (user.contact!.email === null || user.contact!.email === undefined || user.contact!.email !== userData.mailRattachement)) { + update = true; user.contact!.email = userData.mailRattachement; console.log("Updated user.contact.email", JSON.stringify(user.contact!.email)); } - if (user.contact!.cell_phone_number !== userData.numeroMobile) { - updates++; + if (userData.numeroMobile && (user.contact!.cell_phone_number === null || user.contact!.cell_phone_number === undefined || user.contact!.cell_phone_number !== userData.numeroMobile)) { + update = true; user.contact!.cell_phone_number = userData.numeroMobile; console.log("Updated user.contact.cell_phone_number", JSON.stringify(user.contact!.cell_phone_number)); } - if (updates != 0) { + if (update) { // Filter out null values before updating to prevent Prisma errors const convertedUser = this.convertNullToUndefined(user); await this.userService.update(user.uid!, convertedUser); From 06e69d6974ede79f49494b5a30b34dd5906597bb Mon Sep 17 00:00:00 2001 From: Sosthene Date: Thu, 24 Jul 2025 00:20:59 +0200 Subject: [PATCH 14/15] cleanup logs --- src/common/repositories/UsersRepository.ts | 3 --- .../common/IdNotService/IdNotService.ts | 18 ++++-------------- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/src/common/repositories/UsersRepository.ts b/src/common/repositories/UsersRepository.ts index f5e25b83..a6e8871c 100644 --- a/src/common/repositories/UsersRepository.ts +++ b/src/common/repositories/UsersRepository.ts @@ -90,7 +90,6 @@ export default class UsersRepository extends BaseRepository { */ public async update(uid: string, user: User): Promise { - console.log("Updating user", JSON.stringify(user)); const updateArgs: Prisma.UsersUpdateArgs = { where: { uid: uid, @@ -142,8 +141,6 @@ export default class UsersRepository extends BaseRepository { }; } - console.log("updateArgs", JSON.stringify(updateArgs)); - return this.model.update({ ...updateArgs, include: { contact: true, office_membership: { include: { address: true } } } }); } diff --git a/src/services/common/IdNotService/IdNotService.ts b/src/services/common/IdNotService/IdNotService.ts index 3b7cfaee..6616c656 100644 --- a/src/services/common/IdNotService/IdNotService.ts +++ b/src/services/common/IdNotService/IdNotService.ts @@ -222,7 +222,6 @@ export default class IdNotService extends BaseService { public async updateUser(userId: string) { const userInfos = await this.userService.getByUid(userId, { contact: true, role: true, office_membership: true }); const user = User.hydrate(userInfos!); - console.log("Got user from db:", JSON.stringify(user)); const searchParams = new URLSearchParams({ key: this.variables.IDNOT_API_KEY, }); @@ -251,12 +250,9 @@ export default class IdNotService extends BaseService { let userData = (await userRawData.json()) as IRattachementData; - console.log("Got userData from idnot", JSON.stringify(userData)); - if (userData.deleted) { let rattachements: any; - console.log("Fetching rattachements for user", user.uid); try { const res = await fetch(`${this.variables.IDNOT_API_BASE_URL}/api/pp/v2/personnes/${user.idNot}/rattachements?` + searchParams, { method: "GET", @@ -275,8 +271,6 @@ export default class IdNotService extends BaseService { return; } - console.log("rattachements", JSON.stringify(rattachements)); - if (rattachements && rattachements.totalResultCount === 0 && rattachements.result.length === 0) { console.warn("User has no valid rattachements", user.uid); await this.userService.updateCheckedAt(user.uid!); @@ -289,7 +283,6 @@ export default class IdNotService extends BaseService { for (const rattachement of rattachementsResults) { if (rattachement.statutDuRattachement && !rattachement.deleted) { - console.log("rattachementsResults", JSON.stringify(rattachementsResults)); let officeData: IOfficeData; try { @@ -303,12 +296,9 @@ export default class IdNotService extends BaseService { continue; } - console.log("officeData", JSON.stringify(officeData)); - if (officeData.typeEntite.name === "office") { userData = rattachement; userData.entite = officeData; - console.log("Updated userData", JSON.stringify(userData)); break; // Found the first valid office, no need to continue } } @@ -318,7 +308,6 @@ export default class IdNotService extends BaseService { let update = false; if (user.office_membership!.idNot !== userData.entite.ou) { - console.log("Updating user.office_membership"); update = true; let officeData = (await this.officeService.get({ where: { idNot: userData.entite.ou } }))[0]; if (!officeData) { @@ -353,20 +342,21 @@ export default class IdNotService extends BaseService { officeData = await this.officeService.create(office); } user.office_membership = officeData; - console.log("Updated user.office_membership", JSON.stringify(user.office_membership)); + console.log("New office_membership found", JSON.stringify(user.office_membership)); } if (userData.mailRattachement && (user.contact!.email === null || user.contact!.email === undefined || user.contact!.email !== userData.mailRattachement)) { update = true; user.contact!.email = userData.mailRattachement; - console.log("Updated user.contact.email", JSON.stringify(user.contact!.email)); + console.log("New email found", JSON.stringify(user.contact!.email)); } if (userData.numeroMobile && (user.contact!.cell_phone_number === null || user.contact!.cell_phone_number === undefined || user.contact!.cell_phone_number !== userData.numeroMobile)) { update = true; user.contact!.cell_phone_number = userData.numeroMobile; - console.log("Updated user.contact.cell_phone_number", JSON.stringify(user.contact!.cell_phone_number)); + console.log("New cell phone number found", JSON.stringify(user.contact!.cell_phone_number)); } if (update) { + console.log("Found updates for user", user.uid!); // Filter out null values before updating to prevent Prisma errors const convertedUser = this.convertNullToUndefined(user); await this.userService.update(user.uid!, convertedUser); From 84ce2acf6f44892c482a894dc7a5aa51e52fbbc1 Mon Sep 17 00:00:00 2001 From: Sosthene Date: Wed, 30 Jul 2025 19:07:18 +0200 Subject: [PATCH 15/15] [bug] check that users can't see --- src/app/api/admin/OfficeFoldersController.ts | 4 +++- src/app/api/notary/OfficeFoldersController.ts | 11 ++++++++++- src/app/api/super-admin/OfficeFoldersController.ts | 4 +++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/app/api/admin/OfficeFoldersController.ts b/src/app/api/admin/OfficeFoldersController.ts index 612ad17f..34c03cfa 100644 --- a/src/app/api/admin/OfficeFoldersController.ts +++ b/src/app/api/admin/OfficeFoldersController.ts @@ -63,8 +63,10 @@ export default class OfficeFoldersController extends ApiController { } const userId: string = req.body.user.userId; + const officeId: string = req.body.user.office_Id; if (query.where?.stakeholders) delete query.where.stakeholders; - const officeFoldersWhereInput: Prisma.OfficeFoldersWhereInput = { ...query.where, stakeholders: { some: { uid: userId } } }; + if (query.where?.office_uid) delete query.where.office_uid; + const officeFoldersWhereInput: Prisma.OfficeFoldersWhereInput = { ...query.where, stakeholders: { some: { uid: userId } }, office_uid: officeId }; query.where = officeFoldersWhereInput; //call service to get prisma entity diff --git a/src/app/api/notary/OfficeFoldersController.ts b/src/app/api/notary/OfficeFoldersController.ts index 2d8f7792..3dee02ce 100644 --- a/src/app/api/notary/OfficeFoldersController.ts +++ b/src/app/api/notary/OfficeFoldersController.ts @@ -60,8 +60,10 @@ export default class OfficeFoldersController extends ApiController { } const userId: string = req.body.user.userId; + const officeId: string = req.body.user.office_Id; if (query.where?.stakeholders) delete query.where.stakeholders; - const officeFoldersWhereInput: Prisma.OfficeFoldersWhereInput = { ...query.where, stakeholders: { some: { uid: userId } } }; + if (query.where?.office_uid) delete query.where.office_uid; + const officeFoldersWhereInput: Prisma.OfficeFoldersWhereInput = { ...query.where, stakeholders: { some: { uid: userId } }, office_uid: officeId }; query.where = officeFoldersWhereInput; //call service to get prisma entity @@ -253,6 +255,7 @@ export default class OfficeFoldersController extends ApiController { protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; + const officeId: string = req.body.user.office_Id; if (!uid) { this.httpBadRequest(response, "No uid provided"); return; @@ -270,6 +273,12 @@ export default class OfficeFoldersController extends ApiController { return; } + // Add office-level validation + if (officeFolderEntity.office_uid !== officeId) { + this.httpUnauthorized(response, "Not authorized to access this folder"); + return; + } + //Hydrate ressource with prisma entity const officeFolder = OfficeFolder.hydrate(officeFolderEntity); diff --git a/src/app/api/super-admin/OfficeFoldersController.ts b/src/app/api/super-admin/OfficeFoldersController.ts index 988c55c4..258a06ca 100644 --- a/src/app/api/super-admin/OfficeFoldersController.ts +++ b/src/app/api/super-admin/OfficeFoldersController.ts @@ -61,8 +61,10 @@ export default class OfficeFoldersController extends ApiController { } const userId: string = req.body.user.userId; + const officeId: string = req.body.user.office_Id; if (query.where?.stakeholders) delete query.where.stakeholders; - const officeFoldersWhereInput: Prisma.OfficeFoldersWhereInput = { ...query.where, stakeholders: { some: { uid: userId } } }; + if (query.where?.office_uid) delete query.where.office_uid; + const officeFoldersWhereInput: Prisma.OfficeFoldersWhereInput = { ...query.where, stakeholders: { some: { uid: userId } }, office_uid: officeId }; query.where = officeFoldersWhereInput; //call service to get prisma entity