···27272828## License
29293030-[AGPL-3.0](LICENSE)
3030+**Code:** [AGPL-3.0](LICENSE)
3131+3232+**Wiki content:** User contributions on lichen.wiki are licensed under [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) by default. Contributors retain copyright and grant reuse rights under this license. Private wikis are still covered by CC BY-SA 4.0, but access is restricted to members.
+16
src/lib/access.ts
···9898 return ctx as WikiRequestContext;
9999}
100100101101+/**
102102+ * Like resolveWikiContext but never throws -- returns the full context even when
103103+ * access is insufficient. Throws NotFoundError if wiki doesn't exist.
104104+ * Used for pages that render a custom access-denied view.
105105+ */
106106+export async function resolveWikiContextSoft(
107107+ request: Request,
108108+ wikiSlug: string,
109109+): Promise<WikiRequestContext> {
110110+ const ctx = await resolveRequestContext(request, wikiSlug);
111111+ if (!ctx.wiki) {
112112+ throw new NotFoundError("Wiki not found");
113113+ }
114114+ return ctx as WikiRequestContext;
115115+}
116116+101117export async function resolveRequestContext(
102118 request: Request,
103119 wikiSlug?: string,
···11import { getDb } from "../index.ts";
22import type { WikiRow } from "../types.ts";
33+import { deleteNoteByAtUri } from "./note.ts";
3445export function listWikis(): WikiRow[] {
56 const db = getDb();
···9899 .query("SELECT at_uri FROM notes WHERE wiki_slug = ?")
99100 .all(wiki.slug) as { at_uri: string }[];
100101 for (const note of notes) {
101101- db.run("DELETE FROM current_note WHERE note_at_uri = ?", [note.at_uri]);
102102- db.run("DELETE FROM revisions WHERE note_at_uri = ?", [note.at_uri]);
103103- db.run("DELETE FROM snapshots WHERE note_at_uri = ?", [note.at_uri]);
104104- db.run("DELETE FROM backlinks WHERE source_note_uri = ?", [note.at_uri]);
102102+ deleteNoteByAtUri(note.at_uri);
105103 }
106106- db.run("DELETE FROM notes WHERE wiki_slug = ?", [wiki.slug]);
107104 db.run("DELETE FROM memberships WHERE wiki_slug = ?", [wiki.slug]);
108105 db.run("DELETE FROM requests WHERE wiki_slug = ?", [wiki.slug]);
109106 db.run("DELETE FROM wikis WHERE slug = ?", [wiki.slug]);
+2-2
src/server/index.ts
···66import { getDb } from "./db/index.ts";
77import { blobRoutes } from "./routes/blob.ts";
88import { homeRoute } from "./routes/home.ts";
99+import { localeRoutes } from "./routes/locale.ts";
910import { membershipRoutes } from "./routes/membership.ts";
1011import { noteRoutes } from "./routes/note.ts";
1112import { searchRoutes } from "./routes/search.ts";
1212-import { settingsRoutes } from "./routes/settings.ts";
1313import { wikiRoutes } from "./routes/wiki.ts";
14141515// Initialize database on startup
···3232 .use(staticPlugin({ prefix: "/public", assets: "public" }))
3333 .use(atprotoRoutes())
3434 .use(blobRoutes)
3535- .use(settingsRoutes)
3535+ .use(localeRoutes)
3636 .use(homeRoute)
3737 .use(searchRoutes)
3838 .use(membershipRoutes)