From ce8f49157b781ff5f85441483f787e425da66b28 Mon Sep 17 00:00:00 2001 From: Xevion Date: Mon, 27 Feb 2023 19:15:14 -0600 Subject: [PATCH] Setup API config POST route mechanisms --- src/db.ts | 4 +++ src/pages/api/config.ts | 59 ++++++++++++++++++++++------------------- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/db.ts b/src/db.ts index 6d5234d..0935f09 100644 --- a/src/db.ts +++ b/src/db.ts @@ -20,6 +20,10 @@ export async function fetchConfiguration( return getParsed ? parsed : json; } +export async function setConfiguration(config: any): Promise<'OK'> { + return redis.set('config', JSON.stringify(config)); +} + export function getKey(identifier: string, now: Date) { return format(now, 'yyyy-MM-dd') + ':' + identifier; } diff --git a/src/pages/api/config.ts b/src/pages/api/config.ts index 5664454..aa07bfc 100644 --- a/src/pages/api/config.ts +++ b/src/pages/api/config.ts @@ -1,35 +1,40 @@ -import type {NextApiRequest, NextApiResponse} from 'next'; -import {env} from '@/env/server.mjs'; -import {fetchConfiguration} from "@/db"; -import {Configuration} from "@/timing"; +import type { NextApiRequest, NextApiResponse } from 'next'; +import { env } from '@/env/server.mjs'; +import { fetchConfiguration, setConfiguration } from '@/db'; +import { Configuration, ConfigurationSchema } from '@/timing'; type StatusData = { status: ResponseStatus }; -type ResponseStatus = - | 'unauthorized' - | 'failed' - | 'success'; - +type ResponseStatus = 'unauthorized' | 'invalid' | 'failed' | 'success'; export default async function handler( - req: NextApiRequest, - res: NextApiResponse + req: NextApiRequest, + res: NextApiResponse ) { - if (req.query.key != env.API_KEY) { - // auth failed - res.status(401).json({status: 'unauthorized'}); - return; - } + if (req.query.key != env.API_KEY) { + // auth failed + res.status(401).json({ status: 'unauthorized' }); + return; + } - if (req.method == "GET") { - try { - const configuration = await fetchConfiguration(); - res.status(200).json(configuration); - } catch (e) { - console.error(e); - res.status(500).json({status: "failed"}); - } - } else if (req.method == "POST") { - res.status(200).json({status: 'success'}); - } + if (req.method == 'GET') { + try { + const configuration = await fetchConfiguration(); + res.status(200).json(configuration); + } catch (e) { + res.status(500).json({ status: 'failed' }); + } + } else if (req.method == 'POST') { + const json = JSON.parse(req.body); + const parsed = ConfigurationSchema.safeParse(json); + if (parsed.success) { + try { + await setConfiguration(json); + res.status(200).json({ status: 'success' }); + } catch (e) { + console.error(e); + res.status(500).json({ status: 'failed' }); + } + } else res.status(400).json({ status: 'invalid' }); + } }