diff --git a/api/src/index.ts b/api/src/index.ts index 6547f1b..a375971 100644 --- a/api/src/index.ts +++ b/api/src/index.ts @@ -4,6 +4,7 @@ import { getUser } from './lib/user-auth' import GitHub from '@auth/core/providers/github' import notification from './routes/notification' import logbook from './routes/logbook' +import themepark from './routes/themepark' import cronRouter from './jobs/cron' // create app @@ -26,13 +27,14 @@ app.use('/*', verifyAuth()) // example endpoint app.get('/protected', async (c) => { - const user = await getUser(c); - return c.json(user); + const user = await getUser(c); + return c.json(user); }) // define routes & export app app.route('/notification', notification) app.route('/logbook', logbook) +app.route('/themepark', themepark) export default { fetch: app.fetch, scheduled: cronRouter, diff --git a/api/src/lib/cache.ts b/api/src/lib/cache.ts new file mode 100644 index 0000000..33124ce --- /dev/null +++ b/api/src/lib/cache.ts @@ -0,0 +1,9 @@ +import { cache } from 'hono/cache' + +/** + * Cache unit to use for multiple endpoints as needed + */ +export const responseCache = cache({ + cacheName: 'themepark-assistant', + cacheControl: 'max-age=86400' +}); \ No newline at end of file diff --git a/api/src/lib/user-auth.ts b/api/src/lib/user-auth.ts index b5ebec8..fbc0ae9 100644 --- a/api/src/lib/user-auth.ts +++ b/api/src/lib/user-auth.ts @@ -4,7 +4,7 @@ import { UserSelect } from "../types/user"; import { user } from "../db/schema"; import { like } from "drizzle-orm"; import { DrizzleD1Database } from "drizzle-orm/d1"; -import { MissingMailError, UserInactiveError } from "../types/error"; +import { MissingMailError, UserInactiveError, DatabaseError } from "../types/error"; /** * Returns the details of a user from the given context @@ -27,7 +27,7 @@ export async function getUser(c: Context): Promise{ } catch(e){ - throw new Error(`Database error: ${e}`); + throw new DatabaseError(); } const dbResult = userData[0] ?? await createUser(db, mail); @@ -57,7 +57,7 @@ async function createUser(db: DrizzleD1Database, userMail: string): Promise { + const db = getDbContext(c) + + try{ + const themeparks = await db.select({ + id: themepark.id, + name: themepark.name, + countrycode: themepark.countrycode + }).from(themepark); + + return c.json(themeparks); + } + catch{ + throw new DatabaseError(); + } +}) + +/** + * Lists all attractions from a themepark with their id & name + */ +app.get('/list/:id/attraction', responseCache, async (c) => { + const parkId = parseInt(c.req.param('id')); + const db = getDbContext(c) + + try{ + const attractions = await db.select({ + id: attraction.id, + name: attraction.name, + }).from(attraction) + .where(eq(attraction.themeparkId, parkId)); + + return c.json(attractions); + } + catch{ + throw new DatabaseError(); + } +}) + +export default app \ No newline at end of file diff --git a/api/src/types/error.ts b/api/src/types/error.ts index fa072b6..b4a0c94 100644 --- a/api/src/types/error.ts +++ b/api/src/types/error.ts @@ -10,4 +10,10 @@ export class MissingMailError extends HTTPException{ constructor(){ super(400, { message: 'Mail address is missing in authorizaton header.' }) } +} + +export class DatabaseError extends HTTPException{ + constructor(){ + super(500, { message: 'Internal Database Error' }) + } } \ No newline at end of file