next/lib/server/dbHelpers/listQuerier.ts

46 lines
1.5 KiB
TypeScript
Raw Normal View History

import { Band } from "@models/band";
import { Challenge } from "@models/challenges/gen";
import { IStory, Story } from "@models/stories";
import { log } from "../logger";
import { H3Event, EventHandlerRequest, H3EventContext } from "h3";
export default async function (
query: any,
context: H3EventContext,
ev: H3Event<EventHandlerRequest>,
limit: number = 0,
sort?: any,
): Promise<{ stories: IStory[]; total: number }> {
const q = getQuery(ev);
let skipAmt = limit * (parseInt((q.page as string) || "1") - 1);
if (skipAmt < 0) skipAmt = 0;
query["chapters.hidden"] = false;
if (context.currentUser) {
if (!query.author) query.author = {};
if (!query["chapters.bands"]) query["chapters.bands"] = {};
query["chapters.bands"]["$nin"] = context.currentUser.hiddenBands;
query["author"]["$nin"] = context.currentUser.hiddenAuthors;
}
query["ficmas"] = {
$nin: context.ficmasarray_raw!.map((a) => a._id),
};
let stories = await Story.find(query, null)
.collation({ locale: "en" })
.sort(sort ? sort : { "chapters.posted": -1 })
.populate({
path: "ficmas",
populate: { path: "wisher", model: "User", select: "username _id" },
})
.populate("coAuthor", "username _id")
.populate("chapters.bands")
.populate({ path: "challenge", model: Challenge })
.populate("author", "username _id")
.exec();
let oro = stories.filter((a) => a.author != null);
log.debug(JSON.stringify(query), { label: "list query" });
return {
total: oro.length,
stories: oro.slice(skipAmt, limit == 0 ? oro.length : skipAmt + limit),
};
}