You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.4 KiB
119 lines
3.4 KiB
import { h } from "https://deno.land/x/corfu@v2.0.1/mod.ts";
|
|
|
|
import { Application, Router } from "https://deno.land/x/oak@v11.1.0/mod.ts";
|
|
import config from "./config.ts";
|
|
import watt from "./wattpad.ts";
|
|
|
|
const app = new Application();
|
|
//print info on listen
|
|
app.addEventListener("listen", (event) => {
|
|
console.log(
|
|
`voltpad listening on http://${event.hostname.replace(
|
|
"::1",
|
|
"localhost"
|
|
)}:${event.port}`
|
|
);
|
|
});
|
|
|
|
app.use(async (ctx, next) => {
|
|
if (ctx.request.url.pathname === "/") ctx.request.url.pathname = "/index";
|
|
let mod;
|
|
try {
|
|
mod = await import(
|
|
"./routes" +
|
|
ctx.request.url.pathname +
|
|
".tsx" +
|
|
`?update=${Date.now()}`
|
|
);
|
|
} catch {
|
|
try {
|
|
return await ctx.send({
|
|
root: `./static`,
|
|
index: `${ctx.request.url.pathname}`
|
|
});
|
|
} catch {
|
|
try {
|
|
if (
|
|
ctx.request.url.pathname === "/api/getStory" &&
|
|
ctx.request.url.searchParams.get("id")
|
|
) {
|
|
ctx.response.body = await watt.getStory(
|
|
ctx.request.url.searchParams.get("id") as string,
|
|
false
|
|
);
|
|
|
|
ctx.response.headers.set(
|
|
"Content-Type",
|
|
"application/json"
|
|
);
|
|
return;
|
|
} else {
|
|
throw "L bozo";
|
|
}
|
|
} catch {
|
|
mod = await import("./routes/404.tsx");
|
|
ctx.response.status = 404;
|
|
}
|
|
}
|
|
}
|
|
let rizz;
|
|
try {
|
|
rizz = await mod.default(ctx.request.url.searchParams, ctx);
|
|
} catch (e) {
|
|
console.error(e);
|
|
mod = await import("./routes/500.tsx");
|
|
rizz = await mod.default();
|
|
ctx.response.status = 500;
|
|
}
|
|
ctx.response.body = rizz;
|
|
|
|
await next();
|
|
});
|
|
|
|
//(attempt to) set mimetype
|
|
app.use(async (ctx, next) => {
|
|
await next();
|
|
if (ctx.request.url.searchParams.get("feedtype")) {
|
|
switch (ctx.request.url.searchParams.get("feedtype")) {
|
|
case "rss":
|
|
ctx.response.headers.set("Content-Type", "application/rss+xml");
|
|
return;
|
|
case "atom":
|
|
ctx.response.headers.set(
|
|
"Content-Type",
|
|
"application/atom+xml"
|
|
);
|
|
return;
|
|
case "json":
|
|
ctx.response.headers.set(
|
|
"Content-Type",
|
|
"application/feed+json"
|
|
);
|
|
return;
|
|
}
|
|
}
|
|
if (!ctx.response.headers.get("Content-Type")) {
|
|
switch (ctx.request.url.pathname.split(".").at(-1)) {
|
|
case "json":
|
|
ctx.response.headers.set("Content-Type", "application/json");
|
|
break;
|
|
default:
|
|
ctx.response.body =
|
|
"<!DOCTYPE html>" + (ctx.response.body as string);
|
|
ctx.response.headers.set("Content-Type", "text/html");
|
|
}
|
|
}
|
|
});
|
|
|
|
app.use(async (ctx, next) => {
|
|
await next();
|
|
console.log(
|
|
`${ctx.response.status} ${ctx.request.method} ${ctx.request.url}`
|
|
);
|
|
});
|
|
|
|
await app.listen({
|
|
hostname: config.serve.address,
|
|
port: config.serve.port
|
|
});
|