49 lines
1.4 KiB
TypeScript
49 lines
1.4 KiB
TypeScript
import { Handlers } from "$fresh/server.ts";
|
|
import { json } from "@lib/helpers.ts";
|
|
import { getAllMovies, Movie } from "@lib/resource/movies.ts";
|
|
import { Article, getAllArticles } from "@lib/resource/articles.ts";
|
|
import { getAllRecipes, Recipe } from "@lib/resource/recipes.ts";
|
|
import { AccessDeniedError } from "@lib/errors.ts";
|
|
|
|
const isResource = (
|
|
item: Movie | Article | Recipe | boolean,
|
|
): item is Movie | Article | Recipe => {
|
|
return !!item;
|
|
};
|
|
|
|
export const handler: Handlers = {
|
|
async GET(req, ctx) {
|
|
const session = ctx.state.session;
|
|
if (!session) {
|
|
throw new AccessDeniedError();
|
|
}
|
|
|
|
const url = new URL(req.url);
|
|
|
|
const types = url.searchParams.get("type")?.split(", ");
|
|
|
|
let resources = (await Promise.all([
|
|
(!types || types.includes("movie")) && getAllMovies(),
|
|
(!types || types.includes("article")) && getAllArticles(),
|
|
(!types || types.includes("recipe")) && getAllRecipes(),
|
|
])).flat().filter(isResource);
|
|
|
|
const tags = url.searchParams?.get("tags")?.split(",");
|
|
if (tags?.length) {
|
|
resources = resources.filter((r) => {
|
|
return tags?.every((t) => r.tags.includes(t));
|
|
});
|
|
}
|
|
|
|
const authors = url.searchParams?.get("author")?.split(",");
|
|
if (authors?.length) {
|
|
console.log({ authors });
|
|
resources = resources.filter((r) => {
|
|
return r?.meta?.author && authors.includes(r?.meta?.author);
|
|
});
|
|
}
|
|
|
|
return json(resources);
|
|
},
|
|
};
|