fix issue where surveys shared with "Anyone" don't show up

Closes #20
This commit is contained in:
Markus Brueckner 2025-02-15 08:22:33 +01:00
parent 1ab979b5b4
commit 76cf79158e
2 changed files with 16 additions and 6 deletions

View file

@ -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<SurveyMetaData[]> {
/// 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<number, (typeof mySurveys)[0]>();
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,
}))
}))]
}
/**

View file

@ -34,7 +34,7 @@
<div class="p-4">
<h2 class="text-2xl">Surveys you own</h2>
<ul class="ml-8 list-disc">
{#each data.surveys as survey}
{#each data.surveys.sort((a, b) => a.title.localeCompare(b.title)) as survey}
<li class="grid grid-cols-2">
<div>
<Link href="survey/{survey.id}">{survey.title}</Link>