diff --git a/lib/getServerSideProps.ts b/lib/getServerSideProps.ts index 94a24f9..bfafe67 100644 --- a/lib/getServerSideProps.ts +++ b/lib/getServerSideProps.ts @@ -1,7 +1,14 @@ -import { GetServerSideProps } from 'next' import { getBookingByUUID } from '../db/index' -export const getServerSideBooking: GetServerSideProps = async (context) => { +export interface ServerSideBooking { + props: { + booking: object + } +} + +export const getServerSideBooking = async ( + context: any +): Promise => { const { res, params: { uuid: uuids }, @@ -12,14 +19,14 @@ export const getServerSideBooking: GetServerSideProps = async (context) => { if (!booking) { res.statusCode = 404 res.end() - return { props: {} } + return { props: { booking: null } } } await booking.populate('booker').execPopulate() await booking.populate('bill').execPopulate() // TODO: hack, not sure why _id is not serilizable - const bookingJSON = JSON.parse(JSON.stringify(booking.toJSON())) + const bookingJSON = JSON.parse(JSON.stringify(booking.toJSON())) as object return { props: { booking: bookingJSON }, } diff --git a/lib/session.ts b/lib/session.ts index 6c35c15..8d3ed88 100644 --- a/lib/session.ts +++ b/lib/session.ts @@ -1,6 +1,15 @@ import { withIronSession, Handler } from 'next-iron-session' import { getBaseURL } from '../helpers/url' +export enum USER_ROLE { + ADMIN = 'admin', +} + +export interface UserData { + username: string + role: USER_ROLE +} + const SESSION_SECRET = process.env.SESSION_SECRET || 'dev-env-default-secret-991823723' @@ -16,13 +25,13 @@ export default function withSession(handler: Handler) { }) } -export function isAdminSession(req: any, res: any) { - const user = req?.session.get('user') - if (user && user.role === 'admin') { +export function isAdminSession(req: any) { + const user = req?.session.get('user') as UserData + if (user && user.role === USER_ROLE.ADMIN) { return user } - return false + return null } export function redirectToLogin(req: any, res: any) { diff --git a/pages/admin/booking/[uuid]/bill.tsx b/pages/admin/booking/[uuid]/bill.tsx index 93d4a43..c14017f 100644 --- a/pages/admin/booking/[uuid]/bill.tsx +++ b/pages/admin/booking/[uuid]/bill.tsx @@ -1,5 +1,4 @@ import React, { useEffect, useState } from 'react' -import { GetServerSideProps } from 'next' import Footer from '../../../../components/footer' import Header from '../../../../components/header' import Input from '../../../../components/input' @@ -17,27 +16,26 @@ import withSession, { } from '../../../../lib/session' import { getServerSideBooking } from '../../../../lib/getServerSideProps' -export const getServerSideProps: GetServerSideProps = withSession( - async (context) => { - const { req, res } = context +export const getServerSideProps = withSession(async (context) => { + const { req, res } = context - const adminUser = isAdminSession(req, res) + const adminUser = isAdminSession(req) - if (!adminUser) { - redirectToLogin(req, res) - return { props: {} } - } - - const milageMax = await getMilageMax() - const result = await getServerSideBooking(context) - return { - ...result, - // TODO: have a closer look at this type issue. Seems like a bug - // @ts-ignore - props: { ...result.props, milageMax, user: adminUser }, - } + if (!adminUser) { + redirectToLogin(req, res) + return { props: {} } } -) + + const milageMax = await getMilageMax() + const serverSideBookingProps = await getServerSideBooking(context) + return { + props: { + ...serverSideBookingProps.props.booking, + milageMax, + user: adminUser, + }, + } +}) const milageTarifOptions = Object.values(MILAGE_TARIFS).map((tarif) => { return ( diff --git a/pages/admin/booking/[uuid]/index.tsx b/pages/admin/booking/[uuid]/index.tsx index 7106364..6c3dae9 100644 --- a/pages/admin/booking/[uuid]/index.tsx +++ b/pages/admin/booking/[uuid]/index.tsx @@ -17,7 +17,7 @@ export const getServerSideProps: GetServerSideProps = withSession( async (context) => { const { req, res } = context - const adminUser = isAdminSession(req, res) + const adminUser = isAdminSession(req) if (!adminUser) { redirectToLogin(req, res)