Cleanup logging and configuration

This commit is contained in:
Daniel Flanagan 2022-10-11 23:49:36 -05:00
parent c771628263
commit f34ead505b
Signed by untrusted user: lytedev-divvy
GPG key ID: 6D69CEEE4ABBCD82
7 changed files with 103 additions and 105 deletions

View file

@ -1,69 +0,0 @@
import { JSX } from "preact";
import { type PublicUser } from "@/types.ts";
const NAV_ITEM_CLASSES =
"flex justify-center items-center px-4 py-2 hover:bg-gray-300 dark:hover:bg-gray-700";
const HEADER_CLASSES = "bg-gray-200 dark:bg-gray-800";
export function LoginNavItems() {
return (
<>
<a
tabIndex={12}
href="/register"
class={`${NAV_ITEM_CLASSES} ml-auto`}
>
Register
</a>
<a tabIndex={13} href="/login" class={NAV_ITEM_CLASSES}>Login</a>
</>
);
}
export function UserNavItems() {
return (
<>
<a
tabIndex={12}
href="/profile"
class={`${NAV_ITEM_CLASSES} ml-auto`}
>
Profile
</a>
<a tabIndex={13} href="/dashboard" class={NAV_ITEM_CLASSES}>Dashboard</a>
<a tabIndex={13} href="/logout" class={NAV_ITEM_CLASSES}>Logout</a>
</>
);
}
export interface PageProps extends JSX.HTMLAttributes<HTMLDivElement> {
user?: PublicUser;
}
export function Page(props: PageProps) {
console.log("PageProps:", props);
return (
<div class="relative min-h-screen flex flex-col">
<header class="flex justify-start items-center">
<nav class={`flex w-full drop-shadow-md ${HEADER_CLASSES}`}>
<a
tabIndex={10}
href="/"
class={`${NAV_ITEM_CLASSES} text-black dark:text-white`}
>
<h1 class="text-2xl">LyricScreen</h1>
</a>
<a tabIndex={11} href="/note" class={NAV_ITEM_CLASSES}>Notes</a>
{props.user ? UserNavItems() : LoginNavItems()}
</nav>
</header>
<main class="p-2">
{props.children}
</main>
<footer class={`p-2 w-full mt-auto ${HEADER_CLASSES}`}>
"It's a bit much, really..."
</footer>
</div>
);
}

View file

@ -1,6 +1,12 @@
import "$std/log/mod.ts"; import {
type LevelName,
LogLevels,
} from "https://deno.land/std@0.159.0/log/mod.ts";
export interface Config { export interface Config {
log: {
consoleLevelName: LevelName;
};
postgres: { postgres: {
url: string; url: string;
}; };
@ -10,17 +16,36 @@ export interface Config {
}; };
} }
function envOrWarn(key: string, fallback?: string): string | undefined { function envOrWarn(key: string, fallback: string): string {
const val = Deno.env.get(key); const val = Deno.env.get(key);
if (!val) console.warn(`${key} is not set!`); if (!val) console.warn(`${key} is not set! Using fallback: ${fallback}`);
return val || fallback; return val || fallback;
} }
export const config = { function isLogLevelName(s: string): s is LevelName {
return s in LogLevels;
}
const desiredLogLevel = envOrWarn("LOG_LEVEL", "INFO").toUpperCase();
if (!isLogLevelName(desiredLogLevel)) {
console.warn(
`Desired LOG_LEVEL of '${desiredLogLevel}' is invalid. Falling back to 'INFO'`,
);
}
const logLevel: LevelName = isLogLevelName(desiredLogLevel)
? desiredLogLevel
: "INFO";
export const config: Config = {
log: {
consoleLevelName: logLevel,
},
postgres: { postgres: {
url: envOrWarn( url: envOrWarn(
"POSTGRES_URL", "POSTGRES_URL",
"postgresql://postgres:@127.0.0.1:5432/lyricscreen", "postgresql://postgres:@127.0.0.1:5432/lyricscreen",
), ),
}, },
mailgun: {},
}; };

5
log.ts
View file

@ -1,13 +1,12 @@
import { config } from "@/config.ts";
import * as log from "$std/log/mod.ts"; import * as log from "$std/log/mod.ts";
export * as log from "$std/log/mod.ts"; export * as log from "$std/log/mod.ts";
const levelColors = {};
export function setupLoggers() { export function setupLoggers() {
log.setup({ log.setup({
handlers: { handlers: {
console: new log.handlers.ConsoleHandler("DEBUG", { console: new log.handlers.ConsoleHandler(config.log.consoleLevelName, {
formatter: `{datetime} {levelName} {msg}`, formatter: `{datetime} {levelName} {msg}`,
}), }),
}, },

View file

@ -1,5 +1,4 @@
import { type AppProps, Handlers, PageProps } from "$fresh/server.ts"; import { type AppProps, Handlers } from "$fresh/server.ts";
import { Page } from "@/components/Page.tsx";
import { type PublicUser } from "@/types.ts"; import { type PublicUser } from "@/types.ts";
import { type ContextState } from "@/types.ts"; import { type ContextState } from "@/types.ts";
@ -7,18 +6,73 @@ interface MyAppProps extends AppProps {
user?: PublicUser; user?: PublicUser;
} }
export const handler: Handlers<unknown, ContextState> = { export const handler: Handlers<MyAppProps, ContextState> = {
async GET(request: Request, context) { async GET(request: Request, context) {
console.error("\n\nYO\n\n");
console.log("AppHandler:", request, context); console.log("AppHandler:", request, context);
return await context.render(context.state.user); return await context.render({ user: context.state.user });
}, },
}; };
const NAV_ITEM_CLASSES =
"flex justify-center items-center px-4 py-2 hover:bg-gray-300 dark:hover:bg-gray-700";
const HEADER_CLASSES = "bg-gray-200 dark:bg-gray-800";
export function LoginNavItems() {
return (
<>
<a
tabIndex={12}
href="/register"
class={`${NAV_ITEM_CLASSES} ml-auto`}
>
Register
</a>
<a tabIndex={13} href="/login" class={NAV_ITEM_CLASSES}>Login</a>
</>
);
}
export function UserNavItems() {
return (
<>
<a
tabIndex={12}
href="/profile"
class={`${NAV_ITEM_CLASSES} ml-auto`}
>
Profile
</a>
<a tabIndex={13} href="/dashboard" class={NAV_ITEM_CLASSES}>Dashboard</a>
<a tabIndex={13} href="/logout" class={NAV_ITEM_CLASSES}>Logout</a>
</>
);
}
export default function App({ Component, ...props }: MyAppProps) { export default function App({ Component, ...props }: MyAppProps) {
console.log("AppProps:", props); console.log("AppProps:", props);
return ( return (
<Page user={props.user}> <div class="relative min-h-screen flex flex-col">
<Component></Component> <header class="flex justify-start items-center">
</Page> <nav class={`flex w-full drop-shadow-md ${HEADER_CLASSES}`}>
<a
tabIndex={10}
href="/"
class={`${NAV_ITEM_CLASSES} text-black dark:text-white`}
>
<h1 class="text-2xl">LyricScreen</h1>
</a>
<a tabIndex={11} href="/note" class={NAV_ITEM_CLASSES}>Notes</a>
{props.user ? UserNavItems() : LoginNavItems()}
</nav>
</header>
<main class="p-2">
<Component></Component>
</main>
<footer class={`p-2 w-full mt-auto ${HEADER_CLASSES}`}>
"It's a bit much, really..."
</footer>
</div>
); );
} }

View file

@ -2,6 +2,7 @@ import { MiddlewareHandlerContext } from "$fresh/server.ts";
import { deleteCookie, getCookies } from "$std/http/cookie.ts"; import { deleteCookie, getCookies } from "$std/http/cookie.ts";
import { getUserFromNonExpiredLoginToken } from "@/db/mod.ts"; import { getUserFromNonExpiredLoginToken } from "@/db/mod.ts";
import { type ContextState, type PublicUser, type User } from "@/types.ts"; import { type ContextState, type PublicUser, type User } from "@/types.ts";
import { log } from "@/log.ts";
function toPublicUser(user: User): PublicUser { function toPublicUser(user: User): PublicUser {
const { const {
@ -19,7 +20,7 @@ async function currentUser(
) { ) {
let hasBadAuthCookie = false; let hasBadAuthCookie = false;
const { lsauth } = getCookies(request.headers); const { lsauth } = getCookies(request.headers);
console.log("lsauth cookie:", lsauth); log.debug("lsauth cookie:", lsauth);
if (lsauth) { if (lsauth) {
const user = await getUserFromNonExpiredLoginToken(lsauth); const user = await getUserFromNonExpiredLoginToken(lsauth);
if (!user) hasBadAuthCookie = true; if (!user) hasBadAuthCookie = true;

View file

@ -1,13 +1,10 @@
import { Page } from "@/components/Page.tsx";
// import { getToken, getUser } from "@/db/mod.ts"; // import { getToken, getUser } from "@/db/mod.ts";
// import * as base64 from "$std/encoding/base64.ts"; // import * as base64 from "$std/encoding/base64.ts";
import { Handlers, PageProps } from "$fresh/server.ts"; import { Handlers, PageProps } from "$fresh/server.ts";
import { type ContextState, type PublicUser } from "@/types.ts"; import { type ContextState } from "@/types.ts";
export const handler: Handlers<unknown, ContextState> = { export const handler: Handlers<unknown, ContextState> = {
async GET(_request: Request, context) { async GET(_request: Request, context) {
const user: PublicUser | undefined = context.state.user;
if (user != undefined) delete user.passwordDigest;
return await context.render(context.state.user); return await context.render(context.state.user);
}, },
}; };
@ -23,18 +20,12 @@ export default function Dashboard({ data }: PageProps) {
function You(data: unknown) { function You(data: unknown) {
return ( return (
<Page> <p>
<p> You are <pre>{JSON.stringify(data)}</pre>.
You are <pre>{JSON.stringify(data)}</pre>. </p>
</p>
</Page>
); );
} }
function LoginRequired() { function LoginRequired() {
return ( return <a href="/login">You need to login first!</a>;
<Page>
<a href="/login">You need to login first!</a>
</Page>
);
} }

View file

@ -1,11 +1,10 @@
import { Handlers } from "$fresh/server.ts"; import { Handlers } from "$fresh/server.ts";
import { Page } from "@/components/Page.tsx";
// import { getToken, getUser } from "@/db/mod.ts"; // import { getToken, getUser } from "@/db/mod.ts";
// import * as base64 from "$std/encoding/base64.ts"; // import * as base64 from "$std/encoding/base64.ts";
import { deleteCookie } from "$std/http/cookie.ts"; import { deleteCookie } from "$std/http/cookie.ts";
export const handler: Handlers<unknown> = { export const handler: Handlers<unknown> = {
async GET(request: Request, context) { async GET(_request: Request, context) {
const response = await context.render(); const response = await context.render();
deleteCookie(response.headers, "lsauth"); deleteCookie(response.headers, "lsauth");
return response; return response;
@ -14,10 +13,8 @@ export const handler: Handlers<unknown> = {
export default function LoggedOut() { export default function LoggedOut() {
return ( return (
<Page> <p>
<p> If you were logged in before, we've logged you out.
If you were logged in before, we've logged you out. </p>
</p>
</Page>
); );
} }