fix serious issue where deleting a participant from one survey would delete them from all

This commit is contained in:
Markus Brueckner 2025-01-13 09:25:26 +01:00
parent f45deb8680
commit edb8c7b723
3 changed files with 25 additions and 13 deletions

View file

@ -40,7 +40,7 @@
<Link href="survey/{survey.id}">{survey.title}</Link>
<span class="mr-5 inline-block">
({survey.fillRate.filled}/{survey.fillRate.expected})
{#if survey.fillRate.filled === survey.fillRate.expected}
{#if survey.fillRate.filled === survey.fillRate.expected && survey.fillRate.expected > 0}
<CheckIcon />
{/if}
</span>

View file

@ -17,13 +17,22 @@
let { data }: { data: PageData } = $props();
const diagramData = data.skills.flatMap((skill) =>
data.participants.map((participant) => ({
skill: skill.title,
participant: participant.id,
rating: participant.answers.find((answer) => answer.skillId === skill.id)?.rating
}))
);
const diagramData = data.skills.flatMap((skill) => {
if (data.participants.length > 0) {
return data.participants.map((participant) => ({
skill: skill.title,
participant: participant.id,
rating: participant.answers.find((answer) => answer.skillId === skill.id)?.rating
}));
} else {
// fallback pseudo participant because empty diagram data will break the diagram and make the survey page unaccessible
return {
skill: skill.title,
participant: -1,
rating: undefined
};
}
});
function copyLinkToClipboard(link: string) {
navigator.clipboard.writeText(link);

View file

@ -5,7 +5,7 @@ import debug from 'debug';
import { fromFormData } from '$lib/survey';
import { db } from '../../../../../db';
import { surveyAccessTable, surveyAnswersTable, surveySkillsTable, surveysTable } from '../../../../../db/schema';
import { eq, inArray } from 'drizzle-orm';
import { eq, inArray, and } from 'drizzle-orm';
import { addParticipant, addSkill, loadSurveyData } from '../../../../../db/survey';
const log = debug('survey:admin:edit');
@ -58,10 +58,13 @@ export const actions = {
// update the participants where applicable (unchanged participants are left untouched)
const deletedParticipants = survey.participants.filter(participant => !participants.includes(participant.email));
const newParticipants = participants.filter(email => !survey.participants.some(candidate => candidate.email === email));
// delete all participants no longer part of the survey
await db.delete(surveyAccessTable).where(inArray(surveyAccessTable.recepientEmail, deletedParticipants.map(participant => participant.email)));
// delete answers from deleted participants
await db.delete(surveyAnswersTable).where(inArray(surveyAnswersTable.participantId, deletedParticipants.map(participant => participant.id)));
// delete all participants no longer part of the survey (this should also delete their answers via cascade delete)
await db.delete(surveyAccessTable).where(
and(
eq(surveyAccessTable.surveyId, survey.id),
inArray(surveyAccessTable.recepientEmail, deletedParticipants.map(participant => participant.email))
)
);
// add any new participants
for (const newParticipant of newParticipants) {
await addParticipant(survey.id, newParticipant);