Skip to content

Commit a40ef81

Browse files
feat: Add schema validation for result of Sessionize API (#183)
1 parent ed683ba commit a40ef81

File tree

4 files changed

+106
-5
lines changed

4 files changed

+106
-5
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
"react-i18next": "11.18.6",
2525
"react-rewards": "^2.0.4",
2626
"swr": "2.0.3",
27-
"use-local-storage-state": "18.1.1"
27+
"use-local-storage-state": "18.1.1",
28+
"zod": "^3.21.4"
2829
},
2930
"devDependencies": {
3031
"@babel/core": "7.19.3",

src/modules/sessionize/hooks.ts

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,26 @@
1-
import useSWR, { Fetcher } from 'swr'
1+
import useSWR from 'swr'
2+
import { sessionizeViewAllSchema, SessionizeViewAllSchemaType } from './schema'
23

3-
const fetcher: Fetcher<string> = (url: string): Promise<any> => fetch(url).then(res => res.json())
4-
export const useSessionize = () => {
5-
return useSWR(`https://sessionize.com/api/v2/${process.env.NEXT_PUBLIC_SESSIONIZE_ID}/view/All`, fetcher)
4+
const fetcher = (url: string): Promise<SessionizeViewAllSchemaType> => fetch(url).then(res => res.json())
5+
export const useSessionize = (): SessionizeViewAllSchemaType | null => {
6+
const { data, error } = useSWR(
7+
`https://sessionize.com/api/v2/${process.env.NEXT_PUBLIC_SESSIONIZE_ID}/view/All`,
8+
fetcher
9+
)
10+
11+
if (error) {
12+
console.error(error)
13+
return null
14+
}
15+
if (!data) {
16+
return null
17+
}
18+
19+
const parsedResult = sessionizeViewAllSchema.safeParse(data)
20+
if (!parsedResult.success) {
21+
console.error(parsedResult.error)
22+
return null
23+
}
24+
25+
return parsedResult.data
626
}

src/modules/sessionize/schema.ts

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import { z } from 'zod'
2+
3+
const sessionizeSessionSchema = z.object({
4+
id: z.string(),
5+
title: z.string(),
6+
description: z.string(),
7+
startsAt: z.string(),
8+
endsAt: z.string(),
9+
isServiceSession: z.boolean(),
10+
isPlenumSession: z.boolean(),
11+
speakers: z.array(z.string()),
12+
categoryItems: z.array(z.number()),
13+
questionAnswers: z.array(z.string()),
14+
roomId: z.number(),
15+
liveUrl: z.null(),
16+
recordingUrl: z.null(),
17+
status: z.literal('Accepted')
18+
})
19+
20+
const sessionizeSpeakerSchema = z.object({
21+
id: z.string(),
22+
firstName: z.string(),
23+
lastName: z.string(),
24+
bio: z.string(),
25+
tagLine: z.string(),
26+
profilePicture: z.string(),
27+
isTopSpeaker: z.boolean(),
28+
links: z.array(
29+
z.object({
30+
linkType: z.string(),
31+
title: z.string(),
32+
url: z.string()
33+
})
34+
),
35+
sessions: z.array(z.number()),
36+
fullName: z.string(),
37+
categoryItems: z.array(z.number()),
38+
questionAnswers: z.array(z.string())
39+
})
40+
41+
const sessionizeCategorySchema = z.object({
42+
id: z.number(),
43+
title: z.string(),
44+
items: z.array(
45+
z.object({
46+
id: z.number(),
47+
name: z.string(),
48+
sort: z.number()
49+
})
50+
),
51+
sort: z.number(),
52+
type: z.literal('session')
53+
})
54+
55+
const sessionizeRoomSchema = z.object({
56+
id: z.number(),
57+
name: z.string(),
58+
sort: z.number()
59+
})
60+
61+
/**
62+
* Zod schema object for parsing the response from Sessionize's "View All" API.
63+
*/
64+
export const sessionizeViewAllSchema = z.object({
65+
sessions: z.array(sessionizeSessionSchema),
66+
speakers: z.array(sessionizeSpeakerSchema),
67+
questions: z.array(z.any()),
68+
categories: z.array(sessionizeCategorySchema),
69+
rooms: z.array(sessionizeRoomSchema)
70+
})
71+
72+
/**
73+
* Type definition for the parsed response from Sessionize's "View All" API.
74+
*/
75+
export type SessionizeViewAllSchemaType = z.infer<typeof sessionizeViewAllSchema>

yarn.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12045,6 +12045,11 @@ yocto-queue@^0.1.0:
1204512045
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
1204612046
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
1204712047

12048+
zod@^3.21.4:
12049+
version "3.21.4"
12050+
resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db"
12051+
integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==
12052+
1204812053
zwitch@^1.0.0:
1204912054
version "1.0.5"
1205012055
resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"

0 commit comments

Comments
 (0)