diff --git a/api/src/controllers/wiki.js b/api/src/controllers/wiki.js index 445f24a..8c81b9e 100644 --- a/api/src/controllers/wiki.js +++ b/api/src/controllers/wiki.js @@ -116,7 +116,51 @@ export const getWiki = async (req, res, next) => { next(e); } }; - +export const getWikis = async (req, res, next) => { + try { + const result = await Wiki.aggregate([ + { + $lookup: { + from: "users", + as: "createdBy", + let: { userId: "$createdBy" }, + pipeline: [ + { + $match: { $expr: { $eq: ["$_id", "$$userId"] } }, + }, + { + $project: { + username: 1, + }, + }, + ], + }, + }, + { + $unwind: { + path: "$createdBy", + preserveNullAndEmptyArrays: true, + }, + }, + ]); + if (!result || result.length === 0) { + res.status(404).send("No wikis found"); + return; + } + let page = result[0]; + if (process.env.SQ_ALLOW_UNREGISTERED_VIEW && !req.userId && !page.public) { + page = null; + } + const query = {}; + if (process.env.SQ_ALLOW_UNREGISTERED_VIEW && !req.userId) { + query.public = true; + } + const allPages = await Wiki.find(query, { slug: 1, title: 1 }).lean(); + res.json({ page, allPages }); + } catch (e) { + next(e); + } +}; export const deleteWiki = async (req, res, next) => { try { if (req.userRole !== "admin") { diff --git a/api/src/routes/wiki.js b/api/src/routes/wiki.js index d68fbce..4934fc6 100644 --- a/api/src/routes/wiki.js +++ b/api/src/routes/wiki.js @@ -2,6 +2,7 @@ import express from "express"; import { createWiki, getWiki, + getWikis, deleteWiki, updateWiki, } from "../controllers/wiki"; @@ -11,6 +12,7 @@ const router = express.Router(); export default () => { router.post("/new", createWiki); router.post("/update/:wikiId", updateWiki); + router.get("/", getWikis); router.get("*", getWiki); router.delete("*", deleteWiki); return router; diff --git a/client/pages/wiki/[[...slug]].js b/client/pages/wiki/[[...slug]].js index 3fa65c6..17de5f8 100644 --- a/client/pages/wiki/[[...slug]].js +++ b/client/pages/wiki/[[...slug]].js @@ -245,8 +245,18 @@ const Wiki = ({ page, allPages, token, userRole, slug }) => { )} + ) : allPages.length > 0 ? ( + <> + {allPages.map((p) => ( + + + {p.title} + + + ))} + ) : ( - {getLocaleString("wikiThereNothingHereYet")} + {getLocaleString("wikiThereNothingHereYet")} )} {showDeleteModal && ( setShowDeleteModal(false)}> @@ -272,7 +282,6 @@ const Wiki = ({ page, allPages, token, userRole, slug }) => { export const getServerSideProps = withAuthServerSideProps( async ({ token, fetchHeaders, isPublicAccess, query: { slug } }) => { if (!token && !isPublicAccess) return { props: {} }; - const parsedSlug = slug?.length ? slug.join("/") : ""; const { @@ -281,21 +290,29 @@ export const getServerSideProps = withAuthServerSideProps( } = getConfig(); const { role } = token ? jwt.verify(token, SQ_JWT_SECRET) : { role: null }; - try { - const wikiRes = await fetch(`${SQ_API_URL}/wiki/${parsedSlug}`, { - headers: fetchHeaders, - }); - if ( - wikiRes.status === 403 && - (await wikiRes.text()) === "User is banned" - ) { - throw "banned"; - } - const { page, allPages } = await wikiRes.json(); - return { - props: { page, allPages, token, userRole: role, slug: parsedSlug }, - }; + let page, allPages; + if (parsedSlug.length === 0) { + const wikiRes = await fetch(`${SQ_API_URL}/wiki`, { + headers: fetchHeaders, + }); + ({ allPages } = await wikiRes.json()); + + return { + props: {allPages, token, userRole: role, slug: parsedSlug, }, + }; + } else { + const wikiRes = await fetch(`${SQ_API_URL}/wiki/${parsedSlug}`, { + headers: fetchHeaders, + }); + if (wikiRes.status === 403 && (await wikiRes.text()) === "User is banned") { + throw "banned"; + } + ({ page, allPages } = await wikiRes.json()); + return { + props: { page, allPages, token, userRole: role, slug: parsedSlug }, + }; + } } catch (e) { if (e === "banned") throw "banned"; return { props: { token, userRole: role, slug: parsedSlug } };