diff --git a/mod.ts b/mod.ts index 36ebe5b..e5a42d9 100644 --- a/mod.ts +++ b/mod.ts @@ -1,10 +1,14 @@ import { customAlphabet } from '@nanoid'; -import { STATUS_CODE, STATUS_TEXT, StatusCode } from '@std/http'; +import { STATUS_CODE, STATUS_TEXT, StatusCode } from '@std/http/status'; import config from '~config'; import dbClient from 'db/client.ts'; +import buildPage from './ssr/buildPage.ts'; +import buildLogin from './ssr/buildLogin.ts'; +import buildHome from './ssr/buildHome.ts'; + // Using custom alphabet to exclude - and _ const alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; const nanoid = customAlphabet(alphabet, 20); @@ -29,12 +33,23 @@ Deno.serve({ port: config.api.port }, async (req) => { let failed = false; if (req.method === 'GET') { - if (path === '/home') { + if (path === '') { + const redirectHeaders = new Headers(); + redirectHeaders.set('Location', '/api/home'); + return genericResponse(STATUS_CODE.PermanentRedirect, undefined, redirectHeaders); + } else if (path === '/home') { // SSR "login page" - return genericResponse(STATUS_CODE.Unauthorized, 'Please sign in.'); + return buildPage(buildLogin); } else if (path.startsWith('/home/')) { // SSR "home page" - return genericResponse(STATUS_CODE.NotImplemented, 'WIP'); + const userId = path.replace('/home/', ''); + const userMatch = await dbClient.query('SELECT id FROM users WHERE id = ?', [userId]).catch(() => { + failed = true; + }); + if (failed) return buildPage("Couldn't read DB. Please try again."); + if (!userMatch.length) return buildPage('User ID does not exist. Please click on the page header to go back to the sign in page.'); + + return buildPage(buildHome(userId)); } else if (path.startsWith('/read/')) { const planId = path.replace('/read/', ''); diff --git a/ssr/buildHome.ts b/ssr/buildHome.ts new file mode 100644 index 0000000..a0850be --- /dev/null +++ b/ssr/buildHome.ts @@ -0,0 +1,3 @@ +export default (userId: string) => { + return `${userId}`; +}; diff --git a/ssr/buildLogin.ts b/ssr/buildLogin.ts new file mode 100644 index 0000000..8761f94 --- /dev/null +++ b/ssr/buildLogin.ts @@ -0,0 +1,19 @@ +export default `
+ +

Please sign in:

+ +
+ +
+ +
`; diff --git a/ssr/buildPage.ts b/ssr/buildPage.ts new file mode 100644 index 0000000..8b78ae1 --- /dev/null +++ b/ssr/buildPage.ts @@ -0,0 +1,36 @@ +import { STATUS_CODE, STATUS_TEXT } from '@std/http/status'; + +// Utilize the pre-existing stylesheets, do a little tweaking to make it ours +const buildPage = (str: string) => + ` + + + +XIVPlan+DB Manager + + + + + + + + + +

XIVPlan+DB Manager

+${str} + +`; + +const htmlHeaders = new Headers(); +htmlHeaders.append('Content-Type', 'text/html'); + +export default (str: string) => new Response(buildPage(str), { status: STATUS_CODE.OK, statusText: STATUS_TEXT[STATUS_CODE.OK], headers: htmlHeaders });