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 } };