50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
|
import { Readable } from "stream";
|
||
|
import san from "sanitize-html";
|
||
|
import { FormStory } from "~/lib/client/types/FormStory";
|
||
|
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,
|
||
|
};
|
||
|
});
|