From 9dcca1e3dccf6bedf6b55a231b6c5bb2396c18b5 Mon Sep 17 00:00:00 2001 From: Ivan Dimitrov Date: Sat, 11 Nov 2023 16:21:23 +0200 Subject: [PATCH] Squashed commit of the following: commit d8926d88656f6eb1d7d69272e39875e383f91b14 Author: Ivan Dimitrov Date: Sat Nov 11 16:20:17 2023 +0200 maybe prod? commit 4a8854e7218f4b179310daadf9b95f6833686fdb Author: Ivan Dimitrov Date: Sat Nov 11 15:30:31 2023 +0200 better markdown commit c36d0308d2a9766174fde8432866e572a4b82d5e Author: Ivan Dimitrov Date: Sat Nov 11 14:50:00 2023 +0200 cases list styles commit 905d7edaccf2c2fd447f5cae35ef7bd88d86a2b1 Author: Ivan Dimitrov Date: Sat Nov 11 14:46:35 2023 +0200 contact page commit d09bd61eba53c403522d046a48ee6b66f62f9ffb Author: Ivan Dimitrov Date: Sat Nov 11 14:02:47 2023 +0200 more refactor and contact page commit d6257bb9ca35549031c9953fced97bdd53d10454 Author: Ivan Dimitrov Date: Sat Nov 11 13:56:47 2023 +0200 refactor commit 7d2a6ad6002a1e3d7b2ed83822caaffa49d3f37d Author: Ivan Dimitrov Date: Sat Nov 11 13:51:10 2023 +0200 working pages commit 6fa36883854c2e702a0c8b9fa6c9e397e4981575 Author: Ivan Dimitrov Date: Sat Nov 11 11:51:15 2023 +0200 style fixes commit 478412187792104b6c29e33def1cca0ef38ee2bf Author: Ivan Dimitrov Date: Sat Nov 11 08:42:50 2023 +0200 making markdown workd a little bit commit ba24b023fdbc32a2eaab15e29e10a031162287b4 Author: Ivan Dimitrov Date: Fri Nov 10 20:01:59 2023 +0200 content logic --- _content/cases/stepsy.wiki.md | 44 ++++++++++ bun.lockb | Bin 140057 -> 195967 bytes flake.nix | 2 + package.json | 9 +- public/c/cases/stepsy.wiki.md/thumbnail.png | Bin 0 -> 44374 bytes src/app/c/[...slug]/content.module.css | 47 +++++++++++ src/app/c/[...slug]/page.tsx | 88 ++++++++++++++++++++ src/app/cases/page.tsx | 7 ++ src/app/components/cases.tsx | 25 ++++++ src/app/components/links.tsx | 16 ++-- src/app/components/navbar.tsx | 26 ++++++ src/app/contact/page.tsx | 15 ++++ src/app/globals.css | 6 +- src/app/layout.tsx | 8 +- src/app/lib/content.ts | 43 ++++++++++ src/app/page.tsx | 4 +- tailwind.config.ts | 13 ++- 17 files changed, 333 insertions(+), 20 deletions(-) create mode 100644 _content/cases/stepsy.wiki.md create mode 100644 public/c/cases/stepsy.wiki.md/thumbnail.png create mode 100644 src/app/c/[...slug]/content.module.css create mode 100644 src/app/c/[...slug]/page.tsx create mode 100644 src/app/cases/page.tsx create mode 100644 src/app/components/cases.tsx create mode 100644 src/app/components/navbar.tsx create mode 100644 src/app/contact/page.tsx create mode 100644 src/app/lib/content.ts diff --git a/_content/cases/stepsy.wiki.md b/_content/cases/stepsy.wiki.md new file mode 100644 index 0000000..600a5ec --- /dev/null +++ b/_content/cases/stepsy.wiki.md @@ -0,0 +1,44 @@ +--- +title: Multi-tenant knowledge base website based on Google APIs +goal: Create a modern multi-tenant web app that lets users use their Google Drive as a knowledge base +role: Design and implement the web app +date: Jul 29, 2023 - Nov 5, 2023 +--- + +
+Solution + +I chose NextJS as the backbone for this project as it offers the greatest amount of flexibility while still being very powerful both on the client as well as on the server with an active community and thriving ecosystem. + +For styles I chose TailwindCSS with DaisyUI for the optimizations and development speed that come out of using them. Tailwind uses purgecss to minimize the final bundle making the page load and feel faster. + +The database is PostgreSQL with Prisma ORM running on Vercel's cloud infrastructure. + +For authentication I chose NextAuth with JWT as it's the preferred way to handle auth in a NextJS project. + + +The actual implementation is a lengthy process involving many moving parts and lots of code. I'll go over the three most challenging problems in no particular order. + +Interfacing with Google Drive is done to read the content there and almost never used for writing except for setting and removing permissions. To read the content the reader must have appropriate permissions and that's determined by the auth system with a JWT. +For each request we can get the JWT and use it in the google client to auth unless it's an anonymous user, in which case we must use a google service account JWT. This JWT holds a google client access token used by google in determining permissions. +Once the client is set up we can start making drive requests on behalf of the user getting their drive content inside the web app including folders, files, documents, pictures, shared drives and so on, which can later be rendered on a page. +These requests are a bottleneck, which required many optimizations and concurrency tricks to make the site considerably faster than the competition. + +The storage API uses Prisma ORM for storing and getting all the user info including wikis and spaces. When a user logs in they can see their wiki as well as all the wikis they are allowed to manage. It's used to handle authorized requests like changing the wiki/space name, url, permissions and more. Storage is an integral part of any web application. + +The UI/UX uses TailwindCSS and DaisyUI to make everything a fast, modern, optimized and intuitive experience with extra features like dozens of themes as well as a custom theme builder. +React was used with TypeScript to provide a nice modern client-side experience between transitions and interactions. +This setup supports maximum optimization as you can see in the screenshots below allowing the app to reach a lighthouse score of 100 on all but one (it has 99) pages. +Both mobile and desktop is supported. +
+ +This project aims to be a Google Drive frontend. It uses the Google APIs to fetch document data and display that data in a wiki-style web page. + + +![thumbnail](/thumbnail.png) + + +It supports Google Docs, Google Sheets, Google Slides, PDFs and regular files. + + + diff --git a/bun.lockb b/bun.lockb index 68a6bbdbe39a9b2d4d1a9de6be86087e441d6f31..ce03ca9742b703f080817038f7bb08ab5f70ebb7 100755 GIT binary patch delta 64184 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 diff --git a/flake.nix b/flake.nix index 97de4fc..6c7acc2 100644 --- a/flake.nix +++ b/flake.nix @@ -20,7 +20,9 @@ tmux new-session -s my_session -d tmux new-window -t my_session:1 tmux new-window -t my_session:2 + tmux new-window -t my_session:3 tmux send-keys -t my_session:1.0 'vi' C-m + tmux send-keys -t my_session:3.0 'bun run dev' C-m tmux attach-session -t my_session ''; in diff --git a/package.json b/package.json index 0455da4..615d5ed 100644 --- a/package.json +++ b/package.json @@ -14,9 +14,16 @@ "@fortawesome/free-regular-svg-icons": "^6.4.2", "@fortawesome/free-solid-svg-icons": "^6.4.2", "@fortawesome/react-fontawesome": "latest", + "gray-matter": "^4.0.3", "next": "latest", "react": "latest", - "react-dom": "latest" + "react-dom": "latest", + "react-markdown": "^9.0.0", + "rehype-highlight": "^7.0.0", + "rehype-raw": "^7.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "tailwind-highlightjs": "^2.0.1" }, "devDependencies": { "typescript": "latest", diff --git a/public/c/cases/stepsy.wiki.md/thumbnail.png b/public/c/cases/stepsy.wiki.md/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..674951c7bbcb653198c502f1953a3a32c9cc079b GIT binary patch literal 44374 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 { + return getAllPaths().map(p => ({ slug: p.split("/") })) +} + +export default function Content({ params }: Props) { + const imgSize = 1024; + const { data, content } = getContent(params.slug); + + const title = () => { + return ( + + {data.title} + + ) + } + const goal = () => { + const g = data.goal + return g ? + ( +
+

The goal

+ {g} +
+ ) : + "" + } + const role = () => { + const r = data.role + return r ? + ( +
+

My role

+ {r} +
+ ) : + "" + } + + const ctnt = () => { + return ( + + {alt!} + + ) + } + }} + > + {content} + + ) + } + return ( +
+
+ {title()} + {goal()} + {role()} +
+
+ {ctnt()} +
+
+ ) +} diff --git a/src/app/cases/page.tsx b/src/app/cases/page.tsx new file mode 100644 index 0000000..2503574 --- /dev/null +++ b/src/app/cases/page.tsx @@ -0,0 +1,7 @@ +import Cases from "$components/cases"; + +export default function CasesPage() { + return ( + + ) +} diff --git a/src/app/components/cases.tsx b/src/app/components/cases.tsx new file mode 100644 index 0000000..f210d37 --- /dev/null +++ b/src/app/components/cases.tsx @@ -0,0 +1,25 @@ +import { GrayMatterFile } from "gray-matter"; +import Link from "next/link"; +import { getCases } from "../lib/content"; + +export default function Cases() { + const cases: GrayMatterFile[] = getCases() + return ( +
+ {cases.map((c) => { + const d = c.data; + const date = d.date.split("-") + const from = date[0]?.trim() + const to = date[1]?.trim() + return ( +
+ + {d.title} + {from} {to ? `- ${to}` : ""} + +
+ ) + })} +
+ ) +} diff --git a/src/app/components/links.tsx b/src/app/components/links.tsx index 2af472d..b9e647d 100644 --- a/src/app/components/links.tsx +++ b/src/app/components/links.tsx @@ -5,13 +5,15 @@ import Link from "next/link"; export default function Links() { return ( -
- - - - - - +
+
+ + + + + + +
) } diff --git a/src/app/components/navbar.tsx b/src/app/components/navbar.tsx new file mode 100644 index 0000000..5d6a773 --- /dev/null +++ b/src/app/components/navbar.tsx @@ -0,0 +1,26 @@ +"use client" +import Link from "next/link"; +import { usePathname } from "next/navigation"; +import { ReactNode } from "react"; + +export default function Navbar() { + const path = usePathname() + + const link = (text: ReactNode, href: string) => { + return ( + + {text} + + ) + } + + return ( +
+
+ {link("Home", "/")} + {link("Cases", "/cases")} + {link("Contact", "/contact")} +
+
+ ) +} diff --git a/src/app/contact/page.tsx b/src/app/contact/page.tsx new file mode 100644 index 0000000..f5669fc --- /dev/null +++ b/src/app/contact/page.tsx @@ -0,0 +1,15 @@ +import { faEnvelope } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +export default function Contact() { + + const email = "ivan@idimitrov.dev"; + + return ( +
+
+ +
+
+ ) +} diff --git a/src/app/globals.css b/src/app/globals.css index 8acb3ef..1f2b342 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -7,10 +7,14 @@ body { } main { - @apply grid w-full h-full + @apply flex flex-col w-full h-full } svg { @apply w-14 h-14 text-amber-100 hover:text-cyan-500 } +.btn { + @apply bg-gray-900 text-gray-300 hover:bg-gray-700 hover:text-white rounded-md px-3 py-2 text-sm font-medium aria-selected:bg-gray-600 +} + diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 34328c7..9a7aed6 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,4 +1,5 @@ import './globals.css' +import Navbar from './components/navbar' import type { Metadata } from 'next' export const metadata: Metadata = { @@ -13,7 +14,12 @@ export default function RootLayout({ }) { return ( - {children} + +
+ + {children} +
+ ) } diff --git a/src/app/lib/content.ts b/src/app/lib/content.ts new file mode 100644 index 0000000..3388e4a --- /dev/null +++ b/src/app/lib/content.ts @@ -0,0 +1,43 @@ +import fs from "fs"; +import matter, { GrayMatterFile } from "gray-matter"; +import path from "path"; + +const baseDir = "./_content/" + +export const getContent = (slug: string[]): GrayMatterFile => { + let p = path.join(baseDir) + slug.forEach(s => { + p = path.join(p, s) + }) + const file = fs.readFileSync(p, "utf8") + const m = matter(file); + m.data.slug = `/c/${slug.join("/")}` + return m +} + +const getAllPathsRecursive = (base = baseDir): string[] => { + let results = [] as string[]; + + const files = fs.readdirSync(base); + + for (const file of files) { + const filePath = path.join(base, file); + const stat = fs.statSync(filePath); + + if (stat.isDirectory()) { + results = results.concat(getAllPathsRecursive(filePath)); + } else if (path.extname(filePath) === '.md') { + results.push(filePath); + } + } + return results; +} + +export const getAllPaths = (base = baseDir): string[] => { + return getAllPathsRecursive(base).map(p => p.substring(9)) +} + +export const getCases = (): GrayMatterFile[] => { + return getAllPaths(`${baseDir}cases/`).map(s => s.split("/")).map(getContent) +} + diff --git a/src/app/page.tsx b/src/app/page.tsx index f844da4..ea77018 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -2,8 +2,6 @@ import Links from "$components/links"; export default function Home() { return ( -
- -
+ ) } diff --git a/tailwind.config.ts b/tailwind.config.ts index 1af3b8f..0d293a4 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -6,15 +6,14 @@ const config: Config = { './src/components/**/*.{js,ts,jsx,tsx,mdx}', './src/app/**/*.{js,ts,jsx,tsx,mdx}', ], + safelist: [{ + pattern: /hljs+/, + }], theme: { - extend: { - backgroundImage: { - 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', - 'gradient-conic': - 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))', - }, + hljs: { + theme: 'night-owl', }, }, - plugins: [], + plugins: [require('tailwind-highlightjs')], } export default config