From 76cf79158e9a9201b1ad036471e93123aa98567f Mon Sep 17 00:00:00 2001 From: Markus Brueckner Date: Sat, 15 Feb 2025 08:22:33 +0100 Subject: [PATCH] fix issue where surveys shared with "Anyone" don't show up Closes #20 --- src/db/survey.ts | 20 +++++++++++++++----- src/routes/(app)/+page.svelte | 2 +- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/db/survey.ts b/src/db/survey.ts index 424f070..8ba36a4 100644 --- a/src/db/survey.ts +++ b/src/db/survey.ts @@ -3,7 +3,7 @@ import debug from "debug"; const log = debug('survey:admin:edit'); -import { eq, and, inArray, gte, sql } from "drizzle-orm"; +import { eq, or, and, inArray, gte, sql, isNull } from "drizzle-orm"; import { db } from "../db"; import { surveyAccessTable, surveyAnswersTable, surveyPermissionsTable, surveySkillsTable, surveysTable, usersTable } from "../db/schema"; import { AccessLevel, type AccessToken, type Email, type ParticipantId, type SkillId, type SurveyData, type SurveyId, type SurveyMetaData, type UserId } from "$lib/types"; @@ -54,17 +54,27 @@ export async function loadSurveyPermissions(surveyId: SurveyId) { export async function loadMySurveys(userId: UserId): Promise { /// Get all surveys I have access to - const mySurves = await db.select() + const mySurveys = await db.select() .from(surveyPermissionsTable) .innerJoin(surveysTable, eq(surveysTable.id, surveyPermissionsTable.surveyId)) - .where(eq(surveyPermissionsTable.user, userId)); + .where(or(eq(surveyPermissionsTable.user, userId), isNull(surveyPermissionsTable.user))); - return mySurves.map(survey => ({ + // deduplicate the results, always preferring the entry with the direct mention of the given user ID + // Note: without the deduplications, surveys shared with "Anyone" would show up twice, if they were also shared directly with a user + const deduplicatedResults = new Map(); + for (const result of mySurveys) { + const survey = deduplicatedResults.get(result.surveys_table.id); + if (!survey?.survey_permissions_table.user) { + deduplicatedResults.set(result.surveys_table.id, result); + } + } + + return [...deduplicatedResults.values().map(survey => ({ id: survey.surveys_table.id as SurveyId, title: survey.surveys_table.title, description: survey.surveys_table.description, permissions: survey.survey_permissions_table.access, - })) + }))] } /** diff --git a/src/routes/(app)/+page.svelte b/src/routes/(app)/+page.svelte index 122c7c4..7cde7b8 100644 --- a/src/routes/(app)/+page.svelte +++ b/src/routes/(app)/+page.svelte @@ -34,7 +34,7 @@

Surveys you own

    - {#each data.surveys as survey} + {#each data.surveys.sort((a, b) => a.title.localeCompare(b.title)) as survey}
  • {survey.title}