Add HouseManagement integration to AdminPanel and implement removeMemberAsAdmin feature in HouseService: Enhance admin capabilities with new section for house management and functionality to remove members from houses by admins, including points deduction logic.

This commit is contained in:
Julien Froidefond
2025-12-19 13:58:04 +01:00
parent a062f5573b
commit 82069c74bc
9 changed files with 774 additions and 1 deletions

View File

@@ -981,6 +981,62 @@ export class HouseService {
});
}
/**
* Retire un membre d'une maison (par un admin du site)
* Bypass les vérifications normales de permissions
*/
async removeMemberAsAdmin(
houseId: string,
memberIdToRemove: string
): Promise<void> {
const memberToRemoveMembership = await prisma.houseMembership.findUnique({
where: {
houseId_userId: {
houseId,
userId: memberIdToRemove,
},
},
});
if (!memberToRemoveMembership) {
throw new NotFoundError("Membre");
}
// Un OWNER ne peut pas être retiré même par un admin
if (memberToRemoveMembership.role === "OWNER") {
throw new ForbiddenError("Le propriétaire ne peut pas être retiré");
}
// Récupérer les points à enlever depuis les préférences du site
const sitePreferences =
await sitePreferencesService.getOrCreateSitePreferences();
const pointsToDeduct =
(sitePreferences as SitePreferencesWithHousePoints).houseLeavePoints ??
100;
// Supprimer le membership et enlever les points
await prisma.$transaction(async (tx) => {
await tx.houseMembership.delete({
where: {
houseId_userId: {
houseId,
userId: memberIdToRemove,
},
},
});
// Enlever les points à l'utilisateur retiré
await tx.user.update({
where: { id: memberIdToRemove },
data: {
score: {
decrement: pointsToDeduct,
},
},
});
});
}
/**
* Quitte une maison
*/