refactor(api): change stuff in story updating route

if the story doesn't exist/is null, throw
ensure chapter word count is updated (since we weren't already doing that for some reason....)
instead of clearing the original story's chapters and re-adding them one by one, update the existing ones in place, otherwise push to the array
use new signature for `replaceOrUploadContent` call
ensure chapters are sorted
This commit is contained in:
parent d030346dde
commit 05d11e0ea5
Signed by: tablet
GPG Key ID: 924A5F6AF051E87C

@ -11,6 +11,12 @@ import { messages } from "@server/constants";
export default eventHandler(async (ev) => { export default eventHandler(async (ev) => {
let os: (Document<unknown, {}, IStory> & IStory) | null = await storyQuerier(ev); let os: (Document<unknown, {}, IStory> & IStory) | null = await storyQuerier(ev);
isLoggedIn(ev); isLoggedIn(ev);
if (!os) {
throw createError({
statusCode: 404,
message: messages[404],
});
}
if (!canModify(ev, os)) { if (!canModify(ev, os)) {
throw createError({ throw createError({
statusCode: 403, statusCode: 403,
@ -23,39 +29,31 @@ export default eventHandler(async (ev) => {
completed: body.completed, completed: body.completed,
coAuthor: !!body.coAuthor ? body.coAuthor : null, coAuthor: !!body.coAuthor ? body.coAuthor : null,
}; };
for (const oc of os.chapters) {
let filename = `/stories/${oc.id}.txt`;
const bucket = getBucket();
const curs = bucket.find({ filename }).limit(1);
for await (const d of curs) {
await bucket.delete(d._id);
}
}
const cc = os.chapters;
os.chapters = [];
await os.save();
for (const c of body.chapters) { for (const c of body.chapters) {
let idx = cc.findIndex((k) => k.id === c.id); let idx = os.chapters.findIndex((k) => k.id === c.id);
const cont = await bodyHandler(c); const cont = await bodyHandler(c);
if (idx === -1) { if (idx === -1) {
os.chapters!.push({ os.chapters!.push({
...modelFormChapter(c), ...modelFormChapter(c),
words: countWords(cont),
posted: new Date(Date.now()), posted: new Date(Date.now()),
}); });
} else { } else {
os.chapters!.push({ os.chapters[idx] = {
...modelFormChapter(c), ...modelFormChapter(c),
// id: os.chapters[idx].id, id: os.chapters[idx].id,
words: countWords(cont), words: countWords(cont),
posted: cc[idx].posted, posted: os.chapters[idx].posted,
}); };
} }
} }
os.chapters.sort((a, b) => a.index - b.index);
await os.save(); await os.save();
for (let i = 0; i < os.chapters.length; i++) { for (let i = 0; i < os.chapters.length; i++) {
const c = os.chapters[i]; const c = os.chapters[i];
const cont = await bodyHandler(body.chapters[i]); const cont = await bodyHandler(body.chapters[i]);
await replaceOrUploadContent(c.id ?? c._id, cont); await replaceOrUploadContent(c.id ?? c._id, cont, getBucket());
} }
os = await Story.findOneAndUpdate( os = await Story.findOneAndUpdate(
{ {