2023-08-13 02:26:22 +02:00
|
|
|
import { MainLayout } from "@components/layouts/main.tsx";
|
|
|
|
import { Handlers, PageProps } from "$fresh/server.ts";
|
|
|
|
import { AccessDeniedError } from "@lib/errors.ts";
|
2025-01-19 16:43:00 +01:00
|
|
|
import { getLogs, Log } from "@lib/log/index.ts";
|
2023-08-13 02:26:22 +02:00
|
|
|
import { formatDate } from "@lib/string.ts";
|
|
|
|
import { renderMarkdown } from "@lib/documents.ts";
|
|
|
|
|
|
|
|
const renderLog = (t: unknown) =>
|
|
|
|
renderMarkdown(`\`\`\`js
|
2025-01-19 16:43:00 +01:00
|
|
|
${typeof t === "string" ? t : JSON.stringify(t, null, 2).trim()}
|
2023-08-13 02:26:22 +02:00
|
|
|
\`\`\``);
|
|
|
|
|
|
|
|
export const handler: Handlers = {
|
|
|
|
async GET(_, ctx) {
|
|
|
|
const logs = await getLogs();
|
|
|
|
if (!("session" in ctx.state)) {
|
|
|
|
throw new AccessDeniedError();
|
|
|
|
}
|
2025-01-19 16:43:00 +01:00
|
|
|
console.log({ logs });
|
2023-08-13 02:26:22 +02:00
|
|
|
return ctx.render({
|
|
|
|
logs: logs.map((l) => {
|
|
|
|
return {
|
|
|
|
...l,
|
2025-01-19 16:43:00 +01:00
|
|
|
html: l.args.map(renderLog).join("<br/>"),
|
2023-08-13 02:26:22 +02:00
|
|
|
};
|
|
|
|
}),
|
|
|
|
});
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
function LogLine(
|
|
|
|
{ log }: {
|
|
|
|
log: Log;
|
|
|
|
},
|
|
|
|
) {
|
|
|
|
return (
|
|
|
|
<div
|
2025-01-19 16:43:00 +01:00
|
|
|
class="mt-4 flex flex-col gap-2 bg-gray-900 px-4 py-2 rounded-2xl max-w-3xl"
|
2023-08-13 02:26:22 +02:00
|
|
|
style={{ background: "var(--light)" }}
|
|
|
|
>
|
|
|
|
<div class="flex gap-2">
|
|
|
|
<span class="bg-gray-600 py-1 px-2 text-xs rounded-xl text-white">
|
|
|
|
{log.date.getHours().toString().padStart(2, "0")}:{log.date
|
|
|
|
.getMinutes().toString().padStart(2, "0")}:{log.date.getSeconds()
|
|
|
|
.toString().padStart(2, "0")} {formatDate(log.date)}
|
|
|
|
</span>
|
|
|
|
<span class="bg-gray-600 py-1 px-2 text-xs rounded-xl text-white">
|
|
|
|
{log.scope}
|
|
|
|
</span>
|
|
|
|
<span class="bg-gray-600 py-1 px-2 text-xs rounded-xl text-white">
|
|
|
|
{log.level}
|
|
|
|
</span>
|
|
|
|
</div>
|
|
|
|
<div
|
2025-01-19 16:43:00 +01:00
|
|
|
class="text-white"
|
2023-08-13 02:26:22 +02:00
|
|
|
dangerouslySetInnerHTML={{ __html: log.html }}
|
2025-01-19 16:43:00 +01:00
|
|
|
/>
|
2023-08-13 02:26:22 +02:00
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
export default function Greet(
|
|
|
|
{ data: { logs }, url }: PageProps<{ logs: Log[] }>,
|
|
|
|
) {
|
|
|
|
return (
|
|
|
|
<MainLayout url={url}>
|
2025-01-19 16:43:00 +01:00
|
|
|
<h1 class="text-white text-4xl">Logs</h1>
|
2023-08-13 02:26:22 +02:00
|
|
|
|
|
|
|
{logs.map((r) => {
|
|
|
|
return (
|
|
|
|
<LogLine
|
|
|
|
log={r}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
})}
|
|
|
|
</MainLayout>
|
|
|
|
);
|
|
|
|
}
|