next/lib/server/middlewareButNotReally/index.ts

81 lines
2.0 KiB
TypeScript

import { EventHandlerRequest, H3Event } from "h3";
import { messages } from "@server/constants";
import { IStory } from "@models/stories";
import { isFicmasHidden } from "@functions";
import { IDraft } from "@models/stories/draft";
export function isIdNan(ev: H3Event<EventHandlerRequest>) {
const id = parseInt(getRouterParam(ev, "id")!);
if (Number.isNaN(id)) {
throw createError({
statusCode: 400,
message: "Invalid id provided.",
});
}
return id;
}
export function isAdmin(ev: H3Event<EventHandlerRequest>) {
isLoggedIn(ev);
if (!ev.context.currentUser?.profile.isAdmin) {
throw createError({
statusCode: 403,
statusMessage: messages[403],
});
}
}
export function isLoggedIn(ev: H3Event<EventHandlerRequest>) {
if (!ev.context.currentUser) {
throw createError({
statusCode: 401,
statusMessage: messages[401],
});
}
}
export async function storyCheck(
event: H3Event<EventHandlerRequest>,
story: IStory,
idx: number,
) {
let ret: any = {};
if (!story) {
ret.statusCode = 404;
ret.message = messages[404];
} else if (story.ficmas != null) {
if (isFicmasHidden(story)) {
ret = {
statusCode: 423,
message: `TOP SECRET! This story is part of an ongoing challenge. You'll be able to read it after the challenge's reveal date.`,
};
}
} else if (
story.chapters[idx]?.hidden &&
event.context.currentUser?._id !== story.author._id &&
!event.context.currentUser?.profile.isAdmin
) {
ret.statusCode = 403;
ret.message = messages[403];
}
return !!Object.keys(ret).length ? ret : null;
}
export async function captcha(ev: H3Event<EventHandlerRequest>) {
const body = await readBody(ev);
let { data: cres }: { data: any } = await useFetch(
"https://www.google.com/recaptcha/api/siteverify",
{
method: "post",
body: {
secret: useRuntimeConfig().captcha.secret,
response: body["g-recaptcha-response"],
},
},
);
if (!cres.value.success) {
throw createError({
statusCode: 400,
message: "bad recaptcha",
});
}
}