next/server/api/story/new.post.ts

50 lines
1.3 KiB
TypeScript
Raw Normal View History

import { Readable } from "stream";
import san from "sanitize-html";
import { FormStory } from "~/lib/client/types/form/story";
import isLoggedIn from "~/lib/server/middlewareButNotReally/isLoggedIn";
import {
getBucket,
bodyHandler,
modelFormChapter,
} from "~/lib/server/storyHelpers";
import { Story } from "~/models/stories";
import { sanitizeConf } from "~/lib/server/constants";
import { countWords } from "~/lib/functions";
export default eventHandler(async (ev) => {
isLoggedIn(ev);
const bucket = getBucket();
const body = await readBody<FormStory>(ev);
const story = new Story({
title: body.title,
author: ev.context.currentUser!._id,
views: 0,
reviews: 0,
downloads: 0,
ficmas: body.ficmas || null,
challenge: body.challenge || null,
completed: body.completed,
});
for (const c of body.chapters) {
story.chapters.push(modelFormChapter(c));
story.chapters[story.chapters.length - 1].words = countWords(
await bodyHandler(c),
);
}
await story.save();
for (let i = 0; i < story.chapters.length; i++) {
let c = story.chapters[i];
const content = await bodyHandler(body.chapters[i]);
const readable = new Readable();
readable.push(content);
readable.push(null);
readable.pipe(bucket.openUploadStream(`/stories/${c.id}.txt`));
}
return {
success: true,
url: `/story/${story._id}/1`,
story,
};
});