diff --git a/middleware/survey-permissions.ts b/middleware/survey-permissions.ts new file mode 100644 index 0000000..e9d3650 --- /dev/null +++ b/middleware/survey-permissions.ts @@ -0,0 +1,6 @@ +export default defineNuxtRouteMiddleware(async (to) => { + const { $client } = useNuxtApp() + const { error } = await $client.response.list.useQuery({ surveyId: to.params.id as string }) + if (error.value?.data?.code === 'UNAUTHORIZED') + return '/login' +}) diff --git a/pages/dashboard/surveys/[id]/analytics.vue b/pages/dashboard/surveys/[id]/analytics.vue deleted file mode 100644 index 3065e63..0000000 --- a/pages/dashboard/surveys/[id]/analytics.vue +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - - - {{ question.title }} - - - - - - - {{ option }} - - - - - - No response as this question is new! - - - - - - - - - - - - - - - - - - - - {{ bodySlot.data.respondent.name }} - - - Unregistered - - - - - - - - - - - - - - - - - - - - {{ survey?.questions[idx].title }} - - - - - - - - - diff --git a/pages/dashboard/surveys/[id]/index.vue b/pages/dashboard/surveys/[id]/index.vue index 66bbd34..15d2b9a 100644 --- a/pages/dashboard/surveys/[id]/index.vue +++ b/pages/dashboard/surveys/[id]/index.vue @@ -49,7 +49,7 @@ async function printQR() { } async function openAnalytics() { - await navigateTo(`/dashboard/surveys/${route.params.id}/analytics`) + await navigateTo(`/s/${route.params.id}/analytics`) } async function openPreview() { diff --git a/pages/s/[id]/analytics.vue b/pages/s/[id]/analytics.vue new file mode 100644 index 0000000..c81d63d --- /dev/null +++ b/pages/s/[id]/analytics.vue @@ -0,0 +1,149 @@ + + + + + + + + + + + {{ question.title }} + + + + + + + {{ option }} + + + + + + No response as this question is new! + + + + + + + + + + + + + + Responses for {{ survey.title }} + + + + + + + + + + + + + + {{ bodySlot.data.respondent.name }} + + + Unregistered + + + + + + + + + + + + + + + + + + + + {{ survey?.questions[idx].title }} + + + + + + + + + + diff --git a/pages/s/[id].vue b/pages/s/[id]/index.vue similarity index 100% rename from pages/s/[id].vue rename to pages/s/[id]/index.vue diff --git a/server/trpc/routers/analytics/index.ts b/server/trpc/routers/analytics/index.ts index c48f64f..f07a01f 100644 --- a/server/trpc/routers/analytics/index.ts +++ b/server/trpc/routers/analytics/index.ts @@ -5,7 +5,9 @@ import type { QuestionsSchema, SurveyPermissionSchema, SurveyResponseSchema } fr // TODO probably need a better name for all the functions here export const analyticsRouter = router({ + // This has participants: true as users with access to individual survey analytics needs this procedure chartResponses: protectedProcedure + .meta({ participants: true }) .input( z.object({ id: z.string(), @@ -21,7 +23,12 @@ export const analyticsRouter = router({ }, }) const permissions = survey.permissions as SurveyPermissionSchema - if (permissions.find(p => p.email === ctx.session.user.email && p.permission === 'read')) + if ( + permissions + && permissions.find(p => + p.email === ctx.session.user.email && p.permission === 'read', + ) + ) return next() throw new TRPCError({ diff --git a/server/trpc/routers/response/index.ts b/server/trpc/routers/response/index.ts index 6581f71..1909321 100644 --- a/server/trpc/routers/response/index.ts +++ b/server/trpc/routers/response/index.ts @@ -43,7 +43,12 @@ export const responseRouter = router({ }, }) const permissions = survey.permissions as SurveyPermissionSchema - if (permissions.find(p => p.email === ctx.session.user.email && p.permission === 'read')) + if ( + permissions + && permissions.find(p => + p.email === ctx.session.user.email && p.permission === 'read', + ) + ) return next() throw new TRPCError({