Skip to content

Commit 82c1eeb

Browse files
authored
enhance: add redirect from course-specific live quiz link to session-link (#4748)
1 parent 3db16bc commit 82c1eeb

9 files changed

Lines changed: 142 additions & 0 deletions

File tree

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { ValidateAvailableLiveQuizDocument } from '@klicker-uzh/graphql/dist/ops'
2+
import { GetServerSidePropsContext } from 'next'
3+
import { initializeApollo } from '~/lib/apollo'
4+
5+
function CourseLiveQuiz() {
6+
return null
7+
}
8+
9+
export async function getServerSideProps(ctx: GetServerSidePropsContext) {
10+
if (
11+
typeof ctx.params?.id !== 'string' ||
12+
typeof ctx.params?.courseId !== 'string'
13+
) {
14+
return {
15+
redirect: {
16+
destination: '/404',
17+
permanent: false,
18+
},
19+
}
20+
}
21+
22+
const apolloClient = initializeApollo()
23+
const quizId = ctx.params.id as string
24+
const courseId = ctx.params.courseId as string
25+
26+
// validate that the live quiz is valid, published and in course
27+
const liveQuizValid = await apolloClient.query({
28+
query: ValidateAvailableLiveQuizDocument,
29+
variables: { quizId, courseId },
30+
})
31+
32+
if (!liveQuizValid.data?.validateAvailableLiveQuiz) {
33+
return {
34+
redirect: {
35+
destination: '/404',
36+
permanent: false,
37+
},
38+
}
39+
}
40+
41+
return {
42+
redirect: {
43+
destination: `/session/${quizId}`,
44+
permanent: false,
45+
},
46+
}
47+
}
48+
49+
export default CourseLiveQuiz
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
query ValidateAvailableLiveQuiz($quizId: String!, $courseId: String!) {
2+
validateAvailableLiveQuiz(quizId: $quizId, courseId: $courseId)
3+
}

packages/graphql/src/ops.schema.json

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33254,6 +33254,51 @@
3325433254
},
3325533255
"isDeprecated": false,
3325633256
"deprecationReason": null
33257+
},
33258+
{
33259+
"name": "validateAvailableLiveQuiz",
33260+
"description": null,
33261+
"args": [
33262+
{
33263+
"name": "courseId",
33264+
"description": null,
33265+
"type": {
33266+
"kind": "NON_NULL",
33267+
"name": null,
33268+
"ofType": {
33269+
"kind": "SCALAR",
33270+
"name": "String",
33271+
"ofType": null
33272+
}
33273+
},
33274+
"defaultValue": null,
33275+
"isDeprecated": false,
33276+
"deprecationReason": null
33277+
},
33278+
{
33279+
"name": "quizId",
33280+
"description": null,
33281+
"type": {
33282+
"kind": "NON_NULL",
33283+
"name": null,
33284+
"ofType": {
33285+
"kind": "SCALAR",
33286+
"name": "String",
33287+
"ofType": null
33288+
}
33289+
},
33290+
"defaultValue": null,
33291+
"isDeprecated": false,
33292+
"deprecationReason": null
33293+
}
33294+
],
33295+
"type": {
33296+
"kind": "SCALAR",
33297+
"name": "Boolean",
33298+
"ofType": null
33299+
},
33300+
"isDeprecated": false,
33301+
"deprecationReason": null
3325733302
}
3325833303
],
3325933304
"inputFields": null,

packages/graphql/src/ops.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3320,6 +3320,7 @@ export type Query = {
33203320
userRunningLiveQuizzes?: Maybe<Array<LiveQuizInfo>>;
33213321
userScope?: Maybe<UserLoginScope>;
33223322
userTags?: Maybe<Array<Tag>>;
3323+
validateAvailableLiveQuiz?: Maybe<Scalars['Boolean']['output']>;
33233324
};
33243325

33253326

@@ -3712,6 +3713,12 @@ export type QueryStudentLiveQuizArgs = {
37123713
id: Scalars['String']['input'];
37133714
};
37143715

3716+
3717+
export type QueryValidateAvailableLiveQuizArgs = {
3718+
courseId: Scalars['String']['input'];
3719+
quizId: Scalars['String']['input'];
3720+
};
3721+
37153722
export type QuestionFeedback = {
37163723
__typename?: 'QuestionFeedback';
37173724
correct?: Maybe<Scalars['Boolean']['output']>;
@@ -6281,6 +6288,14 @@ export type UserProfileQueryVariables = Exact<{ [key: string]: never; }>;
62816288

62826289
export type UserProfileQuery = { __typename?: 'Query', userProfile?: { __typename?: 'User', id: string, email: string, sendProjectUpdates: boolean, shortname: string, role: UserRole, locale: LocaleType, firstLogin: boolean, catalyst: boolean, catalystTier?: string | null, publicPreview: boolean, privatePreview: boolean } | null };
62836290

6291+
export type ValidateAvailableLiveQuizQueryVariables = Exact<{
6292+
quizId: Scalars['String']['input'];
6293+
courseId: Scalars['String']['input'];
6294+
}>;
6295+
6296+
6297+
export type ValidateAvailableLiveQuizQuery = { __typename?: 'Query', validateAvailableLiveQuiz?: boolean | null };
6298+
62846299
export type FeedbackAddedSubscriptionVariables = Exact<{
62856300
quizId: Scalars['String']['input'];
62866301
}>;
@@ -6634,6 +6649,7 @@ export const ParticipationsDocument = {"kind":"Document","definitions":[{"kind":
66346649
export const SelfDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"Self"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"self"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"scopeQuizId"}},{"kind":"Field","name":{"kind":"Name","value":"email"}},{"kind":"Field","name":{"kind":"Name","value":"username"}},{"kind":"Field","name":{"kind":"Name","value":"avatar"}},{"kind":"Field","name":{"kind":"Name","value":"avatarSettings"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"skinTone"}},{"kind":"Field","name":{"kind":"Name","value":"eyes"}},{"kind":"Field","name":{"kind":"Name","value":"mouth"}},{"kind":"Field","name":{"kind":"Name","value":"hair"}},{"kind":"Field","name":{"kind":"Name","value":"facialHair"}},{"kind":"Field","name":{"kind":"Name","value":"accessory"}},{"kind":"Field","name":{"kind":"Name","value":"hairColor"}},{"kind":"Field","name":{"kind":"Name","value":"clothing"}},{"kind":"Field","name":{"kind":"Name","value":"clothingColor"}}]}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isProfilePublic"}},{"kind":"Field","name":{"kind":"Name","value":"xp"}},{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"levelData"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"index"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatar"}},{"kind":"Field","name":{"kind":"Name","value":"requiredXp"}},{"kind":"Field","name":{"kind":"Name","value":"nextLevel"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"index"}},{"kind":"Field","name":{"kind":"Name","value":"requiredXp"}},{"kind":"Field","name":{"kind":"Name","value":"avatar"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}}]} as unknown as DocumentNode<SelfQuery, SelfQueryVariables>;
66356650
export const SelfWithAchievementsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"SelfWithAchievements"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"selfWithAchievements"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"participant"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"username"}},{"kind":"Field","name":{"kind":"Name","value":"avatar"}},{"kind":"Field","name":{"kind":"Name","value":"avatarSettings"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"skinTone"}},{"kind":"Field","name":{"kind":"Name","value":"eyes"}},{"kind":"Field","name":{"kind":"Name","value":"mouth"}},{"kind":"Field","name":{"kind":"Name","value":"hair"}},{"kind":"Field","name":{"kind":"Name","value":"facialHair"}},{"kind":"Field","name":{"kind":"Name","value":"accessory"}},{"kind":"Field","name":{"kind":"Name","value":"hairColor"}},{"kind":"Field","name":{"kind":"Name","value":"clothing"}},{"kind":"Field","name":{"kind":"Name","value":"clothingColor"}}]}},{"kind":"Field","name":{"kind":"Name","value":"xp"}},{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"levelData"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"index"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatar"}},{"kind":"Field","name":{"kind":"Name","value":"requiredXp"}},{"kind":"Field","name":{"kind":"Name","value":"nextLevel"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"index"}},{"kind":"Field","name":{"kind":"Name","value":"requiredXp"}},{"kind":"Field","name":{"kind":"Name","value":"avatar"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"achievements"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"achievedAt"}},{"kind":"Field","name":{"kind":"Name","value":"achievedCount"}},{"kind":"Field","name":{"kind":"Name","value":"achievement"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameDE"}},{"kind":"Field","name":{"kind":"Name","value":"nameEN"}},{"kind":"Field","name":{"kind":"Name","value":"descriptionDE"}},{"kind":"Field","name":{"kind":"Name","value":"descriptionEN"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"iconColor"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"achievements"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameDE"}},{"kind":"Field","name":{"kind":"Name","value":"nameEN"}},{"kind":"Field","name":{"kind":"Name","value":"descriptionDE"}},{"kind":"Field","name":{"kind":"Name","value":"descriptionEN"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"iconColor"}}]}}]}}]}}]} as unknown as DocumentNode<SelfWithAchievementsQuery, SelfWithAchievementsQueryVariables>;
66366651
export const UserProfileDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserProfile"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userProfile"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"email"}},{"kind":"Field","name":{"kind":"Name","value":"sendProjectUpdates"}},{"kind":"Field","name":{"kind":"Name","value":"shortname"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"locale"}},{"kind":"Field","name":{"kind":"Name","value":"firstLogin"}},{"kind":"Field","name":{"kind":"Name","value":"catalyst"}},{"kind":"Field","name":{"kind":"Name","value":"catalystTier"}},{"kind":"Field","name":{"kind":"Name","value":"publicPreview"}},{"kind":"Field","name":{"kind":"Name","value":"privatePreview"}}]}}]}}]} as unknown as DocumentNode<UserProfileQuery, UserProfileQueryVariables>;
6652+
export const ValidateAvailableLiveQuizDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ValidateAvailableLiveQuiz"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"quizId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"validateAvailableLiveQuiz"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"quizId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"quizId"}}},{"kind":"Argument","name":{"kind":"Name","value":"courseId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseId"}}}]}]}}]} as unknown as DocumentNode<ValidateAvailableLiveQuizQuery, ValidateAvailableLiveQuizQueryVariables>;
66376653
export const FeedbackAddedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"FeedbackAdded"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"quizId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"feedbackAdded"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"quizId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"quizId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"isPublished"}},{"kind":"Field","name":{"kind":"Name","value":"isPinned"}},{"kind":"Field","name":{"kind":"Name","value":"isResolved"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"votes"}},{"kind":"Field","name":{"kind":"Name","value":"resolvedAt"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"responses"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"positiveReactions"}},{"kind":"Field","name":{"kind":"Name","value":"negativeReactions"}}]}}]}}]}}]} as unknown as DocumentNode<FeedbackAddedSubscription, FeedbackAddedSubscriptionVariables>;
66386654
export const FeedbackCreatedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"FeedbackCreated"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"quizId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"feedbackCreated"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"quizId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"quizId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"isPublished"}},{"kind":"Field","name":{"kind":"Name","value":"isPinned"}},{"kind":"Field","name":{"kind":"Name","value":"isResolved"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"votes"}},{"kind":"Field","name":{"kind":"Name","value":"resolvedAt"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"responses"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"positiveReactions"}},{"kind":"Field","name":{"kind":"Name","value":"negativeReactions"}}]}}]}}]}}]} as unknown as DocumentNode<FeedbackCreatedSubscription, FeedbackCreatedSubscriptionVariables>;
66396655
export const FeedbackPinnedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"FeedbackPinned"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"quizId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"feedbackPinned"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"quizId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"quizId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"isPublished"}},{"kind":"Field","name":{"kind":"Name","value":"isPinned"}},{"kind":"Field","name":{"kind":"Name","value":"isResolved"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"votes"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}}]}}]}}]} as unknown as DocumentNode<FeedbackPinnedSubscription, FeedbackPinnedSubscriptionVariables>;

packages/graphql/src/public/client.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@
253253
"Self": "50d56564a9b5fa327dbe4bf7df8ca2a04ad85b1e1a4c4956227cc7f256fa7e2d",
254254
"SelfWithAchievements": "07ed90975e46d0b5a00efb45e844030ae6bf16653e39c53ecec5afddc72c62f2",
255255
"UserProfile": "f4a4fe22807e8c654b850a0f4e9f7356e798ac14ae35376a5f7004d935ccbd23",
256+
"ValidateAvailableLiveQuiz": "909f0d94f16f564e4587bad0865ed8ffb950cfbf47d008d8a52b2cad61f24ac6",
256257
"FeedbackAdded": "232a4b6cf92dfd02611bc0be4fa28e10f1c4d1d0f1540616fd2d742f76af870f",
257258
"FeedbackCreated": "2baa4fb4b7836d924f9077f3a5e1936d3127ad327b92f90c51bae1051f9f5a2e",
258259
"FeedbackPinned": "d79cf0244c86c1df872244f78acef3f9aba6ff73ab542b7de782a1a66cd4e5e0",

packages/graphql/src/public/schema.graphql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2144,6 +2144,7 @@ type Query {
21442144
userRunningLiveQuizzes: [LiveQuizInfo!]
21452145
userScope: UserLoginScope
21462146
userTags: [Tag!]
2147+
validateAvailableLiveQuiz(courseId: String!, quizId: String!): Boolean
21472148
}
21482149

21492150
type QuestionFeedback {

0 commit comments

Comments
 (0)