From 3caefb8833228c3569ff4369004ba566e2d770ee Mon Sep 17 00:00:00 2001 From: w4c-templates Date: Sun, 11 Oct 2026 23:29:57 +0300 Subject: [PATCH] chore(template): publish Content.Next --- .dockerignore | 12 + .env.example | 15 + .eslintrc.json | 7 + .github/workflows/ci.yml | 33 + .gitignore | 11 + .w4c/preview.png | Bin 0 -> 63659 bytes .w4c/qa.json | 43 + .w4c/template.json | 29 + README.md | 81 +- app/(app)/dashboard/page.tsx | 59 + app/(app)/layout.tsx | 12 + app/(auth)/layout.tsx | 13 + app/(auth)/login/page.tsx | 15 + app/(auth)/register/page.tsx | 15 + app/(marketing)/authors/[slug]/page.tsx | 51 + app/(marketing)/blog/[slug]/page.tsx | 99 + app/(marketing)/blog/page.tsx | 49 + app/(marketing)/docs/[slug]/page.tsx | 93 + app/(marketing)/docs/page.tsx | 42 + app/(marketing)/layout.tsx | 12 + app/(marketing)/legal/privacy/page.tsx | 10 + app/(marketing)/legal/terms/page.tsx | 10 + app/(marketing)/page.tsx | 82 + app/(marketing)/pricing/page.tsx | 74 + app/(marketing)/search/page.tsx | 45 + app/(marketing)/tags/[slug]/page.tsx | 40 + app/(marketing)/tags/page.tsx | 32 + app/admin/audit/page.tsx | 39 + app/admin/docs/page.tsx | 12 + app/admin/layout.tsx | 31 + app/admin/page.tsx | 53 + app/admin/posts/page.tsx | 16 + app/admin/users/page.tsx | 51 + app/api/admin/docs/[id]/route.ts | 40 + app/api/admin/docs/route.ts | 27 + app/api/admin/posts/[id]/route.ts | 40 + app/api/admin/posts/route.ts | 27 + app/api/admin/users/[id]/route.ts | 43 + app/api/admin/users/route.ts | 17 + app/api/auth/login/route.ts | 31 + app/api/auth/logout/route.ts | 10 + app/api/auth/me/route.ts | 10 + app/api/auth/register/route.ts | 44 + app/api/billing/checkout/route.ts | 43 + app/api/billing/webhook/route.ts | 35 + app/api/health/route.ts | 7 + app/error.tsx | 13 + app/globals.css | 153 + app/layout.tsx | 31 + app/loading.tsx | 10 + app/not-found.tsx | 14 + app/robots.ts | 9 + app/rss.xml/route.ts | 43 + app/sitemap.ts | 39 + components/AdminNav.tsx | 29 + components/AuthForm.tsx | 79 + components/SiteFooter.tsx | 25 + components/SiteHeader.tsx | 56 + components/ThemeToggle.tsx | 41 + components/UpgradeButton.tsx | 43 + components/admin/DocsManager.tsx | 317 + components/admin/PostsManager.tsx | 351 + components/admin/UserActions.tsx | 44 + components/content/Markdown.tsx | 270 + components/content/PagePagination.tsx | 29 + components/content/PostCard.tsx | 44 + components/content/Toc.tsx | 19 + components/ui/index.tsx | 68 + docker/Dockerfile | 23 + docker/docker-compose.yml | 15 + lib/content.ts | 61 + lib/env.ts | 20 + lib/i18n.ts | 19 + lib/password.ts | 10 + lib/plans.ts | 41 + lib/rbac.ts | 20 + lib/server/audit.ts | 15 + lib/server/auth.ts | 75 + lib/server/content.ts | 349 + lib/server/db.ts | 8 + lib/server/email.ts | 44 + lib/server/guard.ts | 24 + lib/server/payments.ts | 86 + lib/utils.ts | 21 + messages/en.json | 148 + middleware.ts | 28 + next.config.ts | 26 + package-lock.json | 8771 +++++++++++++++++++++++ package.json | 46 + postcss.config.mjs | 5 + prisma/schema.prisma | 119 + prisma/seed.ts | 373 + public/favicon.svg | 4 + tests/e2e/smoke.mjs | 120 + tests/unit/auth.test.ts | 19 + tests/unit/content.test.ts | 57 + tests/unit/plans.test.ts | 22 + tsconfig.json | 21 + tsconfig.tsbuildinfo | 1 + vitest.config.ts | 12 + 100 files changed, 13888 insertions(+), 2 deletions(-) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 .eslintrc.json create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 .w4c/preview.png create mode 100644 .w4c/qa.json create mode 100644 .w4c/template.json create mode 100644 app/(app)/dashboard/page.tsx create mode 100644 app/(app)/layout.tsx create mode 100644 app/(auth)/layout.tsx create mode 100644 app/(auth)/login/page.tsx create mode 100644 app/(auth)/register/page.tsx create mode 100644 app/(marketing)/authors/[slug]/page.tsx create mode 100644 app/(marketing)/blog/[slug]/page.tsx create mode 100644 app/(marketing)/blog/page.tsx create mode 100644 app/(marketing)/docs/[slug]/page.tsx create mode 100644 app/(marketing)/docs/page.tsx create mode 100644 app/(marketing)/layout.tsx create mode 100644 app/(marketing)/legal/privacy/page.tsx create mode 100644 app/(marketing)/legal/terms/page.tsx create mode 100644 app/(marketing)/page.tsx create mode 100644 app/(marketing)/pricing/page.tsx create mode 100644 app/(marketing)/search/page.tsx create mode 100644 app/(marketing)/tags/[slug]/page.tsx create mode 100644 app/(marketing)/tags/page.tsx create mode 100644 app/admin/audit/page.tsx create mode 100644 app/admin/docs/page.tsx create mode 100644 app/admin/layout.tsx create mode 100644 app/admin/page.tsx create mode 100644 app/admin/posts/page.tsx create mode 100644 app/admin/users/page.tsx create mode 100644 app/api/admin/docs/[id]/route.ts create mode 100644 app/api/admin/docs/route.ts create mode 100644 app/api/admin/posts/[id]/route.ts create mode 100644 app/api/admin/posts/route.ts create mode 100644 app/api/admin/users/[id]/route.ts create mode 100644 app/api/admin/users/route.ts create mode 100644 app/api/auth/login/route.ts create mode 100644 app/api/auth/logout/route.ts create mode 100644 app/api/auth/me/route.ts create mode 100644 app/api/auth/register/route.ts create mode 100644 app/api/billing/checkout/route.ts create mode 100644 app/api/billing/webhook/route.ts create mode 100644 app/api/health/route.ts create mode 100644 app/error.tsx create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/loading.tsx create mode 100644 app/not-found.tsx create mode 100644 app/robots.ts create mode 100644 app/rss.xml/route.ts create mode 100644 app/sitemap.ts create mode 100644 components/AdminNav.tsx create mode 100644 components/AuthForm.tsx create mode 100644 components/SiteFooter.tsx create mode 100644 components/SiteHeader.tsx create mode 100644 components/ThemeToggle.tsx create mode 100644 components/UpgradeButton.tsx create mode 100644 components/admin/DocsManager.tsx create mode 100644 components/admin/PostsManager.tsx create mode 100644 components/admin/UserActions.tsx create mode 100644 components/content/Markdown.tsx create mode 100644 components/content/PagePagination.tsx create mode 100644 components/content/PostCard.tsx create mode 100644 components/content/Toc.tsx create mode 100644 components/ui/index.tsx create mode 100644 docker/Dockerfile create mode 100644 docker/docker-compose.yml create mode 100644 lib/content.ts create mode 100644 lib/env.ts create mode 100644 lib/i18n.ts create mode 100644 lib/password.ts create mode 100644 lib/plans.ts create mode 100644 lib/rbac.ts create mode 100644 lib/server/audit.ts create mode 100644 lib/server/auth.ts create mode 100644 lib/server/content.ts create mode 100644 lib/server/db.ts create mode 100644 lib/server/email.ts create mode 100644 lib/server/guard.ts create mode 100644 lib/server/payments.ts create mode 100644 lib/utils.ts create mode 100644 messages/en.json create mode 100644 middleware.ts create mode 100644 next.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 prisma/schema.prisma create mode 100644 prisma/seed.ts create mode 100644 public/favicon.svg create mode 100644 tests/e2e/smoke.mjs create mode 100644 tests/unit/auth.test.ts create mode 100644 tests/unit/content.test.ts create mode 100644 tests/unit/plans.test.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.tsbuildinfo create mode 100644 vitest.config.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..776ad08 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,12 @@ +node_modules +.next +.git +.env +.env.local +*.db +docker +.github +.w4c +tests +README.md +coverage diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..83f1bb7 --- /dev/null +++ b/.env.example @@ -0,0 +1,15 @@ +# --- Core ------------------------------------------------------------------- +# SQLite in development; point at Postgres in production (see README). +DATABASE_URL="file:./dev.db" +# Public origin used for absolute URLs (sitemap.xml, rss.xml, OG, checkout redirects). +NEXT_PUBLIC_SITE_URL="http://localhost:3000" + +# --- Payments (optional) ---------------------------------------------------- +# Leave empty to use the built-in mock provider (no keys needed). +STRIPE_SECRET_KEY="" +STRIPE_WEBHOOK_SECRET="" + +# --- Email (optional) ------------------------------------------------------- +# Leave empty to use the built-in log provider (no keys needed). +RESEND_API_KEY="" +EMAIL_FROM="Acme " diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..3b8ecbf --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,7 @@ +{ + "extends": "next/core-web-vitals", + "rules": { + "@next/next/no-img-element": "off", + "react/no-unescaped-entities": "off" + } +} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..be6fc50 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,33 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +jobs: + quality: + runs-on: ubuntu-latest + env: + DATABASE_URL: "file:./ci.db" + NEXT_PUBLIC_SITE_URL: "http://localhost:3000" + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + - run: npm ci + - run: npm run lint + - run: npm run typecheck + - run: npm run db:setup + - run: npm test + - run: npm run build + - name: e2e smoke + run: | + npm start & + for i in $(seq 1 60); do + if curl -sf http://127.0.0.1:3000/api/health >/dev/null; then break; fi + sleep 1 + done + npm run test:e2e diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ee7ee5d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +node_modules +.next +out +dist +coverage +.env +.env.local +*.db +*.db-journal +.vercel +next-env.d.ts diff --git a/.w4c/preview.png b/.w4c/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..1ef152c6a470c02a7c2acd3f61c0af80fb2335da GIT binary patch literal 63659 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

B{>l@xu-|7r&B_#y3ICu5Ud{TAE zk)gb0U|E-E7(Rpwuu=oQKSKHK_Yfh8G8AC3-2qN=qulOIL@h@W4EW4|≪FKPo8f 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 Built by forking [`Base.Next`](../Base.Next); it inherits auth, roles, Prisma, mock payments +> and email, the admin shell, SEO, i18n, CI and Docker. + +## Quickstart + +```bash +npm ci +cp .env.example .env # SQLite + mock providers by default — no keys needed +npm run db:setup # prisma db push + seed +npm run dev # http://localhost:3000 +``` + +Demo accounts (seeded), password `password`: + +| Role | Email | Can do | +|---|---|---| +| admin | `admin@example.com` | everything, incl. users & audit | +| editor | `editor@example.com` | author posts and docs | +| user | `user@example.com` | read-only | + +## What works out of the box + +- **Content** — posts and docs stored in Prisma (authored in the admin, not hard-coded), rendered by + an in-repo markdown renderer with a table of contents, fenced-code highlighting + language labels, + lists, quotes, links and inline formatting. +- **Public site** — paginated `/blog`, post pages with byline + related posts, `/docs` grouped by + section with a sidebar and prev/next, `/tags`, `/authors/[slug]` and a server-side `/search`. +- **Authoring admin** — `/admin/posts` and `/admin/docs`: create/edit/preview/publish/**draft**, + featured posts, tag multi-select, with live preview; server API under `/api/admin/posts` and + `/api/admin/docs` enforces the role and writes an audit entry. +- **Feeds/SEO** — `sitemap.xml` (posts, docs, tags, authors), `rss.xml`, per-post metadata and + JSON-LD `Article`. +- **Core** — auth + roles, mock payments/email, admin shell, `/api/health`, both themes, + responsive to 360 px, WCAG AA contrast. + +## Markdown support + +Extending the base's minimal renderer (no `mdx`/`remark`/`gray-matter` dependency): `#`–`###` +headings, paragraphs, ordered/unordered lists, blockquotes, `---`, `**bold**`, `*italic*`, +`` `inline code` ``, `[links](/path)`, and fenced code blocks with a language label and lightweight +syntax highlighting. + +## Data model + +`prisma/schema.prisma`: `Author`, `Tag`, `PostTag`, `Post`, `Doc` (plus the base `User`, +`Session`, `Subscription`, `AuditLog`). SQLite in development; point `DATABASE_URL` at Postgres +for production. + +## Scripts + +| Script | What it does | +|---|---| +| `npm run dev` | Dev server with HMR | +| `npm run build` / `npm start` | Production build / serve | +| `npm run lint` / `npm run typecheck` | ESLint / `tsc --noEmit` | +| `npm test` | Unit tests (Vitest) | +| `npm run test:e2e` | HTTP end-to-end smoke (server must be running) | +| `npm run db:setup` | `prisma db push` + seed | + +## Deployment + +```bash +docker compose -f docker/docker-compose.yml up --build +``` + +## Quality + +```bash +node ../templates2/qa.mjs Content.Next # from the repo root: node templates2/qa.mjs Content.Next +``` + +The harness isolates a clean copy, then runs install → verify → test → build → boot → routes → +e2e → screenshot. See [`../CONTRACT.md`](../CONTRACT.md) for the Definition of Done. diff --git a/app/(app)/dashboard/page.tsx b/app/(app)/dashboard/page.tsx new file mode 100644 index 0000000..d4c5d19 --- /dev/null +++ b/app/(app)/dashboard/page.tsx @@ -0,0 +1,59 @@ +import Link from 'next/link'; +import { Badge, Card } from '@/components/ui'; +import { requireUser } from '@/lib/server/auth'; +import { db } from '@/lib/server/db'; +import { getPlan } from '@/lib/plans'; +import { t } from '@/lib/i18n'; + +export const dynamic = 'force-dynamic'; + +export default async function DashboardPage() { + const user = await requireUser(); + const sub = await db.subscription.findUnique({ where: { userId: user.id } }); + const plan = getPlan(sub?.plan); + const usedCalls = await db.auditLog.count({ where: { actorId: user.id } }); + + const usage = [ + { label: 'Seats', used: 1, limit: plan.limits.seats }, + { label: 'API calls', used: usedCalls, limit: plan.limits.apiCalls }, + ]; + + return ( +

+
+
+

{t('dashboard.title')}

+

{t('dashboard.welcome', { name: user.name || user.email })}

+
+ {plan.name} +
+ + {t('pricing.choose')}}> +

+ {plan.name} — ${plan.price} / month +

+
+ + +
    + {usage.map((u) => { + const pct = Math.min(100, Math.round((u.used / u.limit) * 100)); + return ( +
  • +
    + {u.label} + + {u.used} / {u.limit} + +
    +
    +
    +
    +
  • + ); + })} +
+
+
+ ); +} diff --git a/app/(app)/layout.tsx b/app/(app)/layout.tsx new file mode 100644 index 0000000..f5818a2 --- /dev/null +++ b/app/(app)/layout.tsx @@ -0,0 +1,12 @@ +import { SiteHeader } from '@/components/SiteHeader'; +import { SiteFooter } from '@/components/SiteFooter'; + +export default function AppLayout({ children }: { children: React.ReactNode }) { + return ( +
+ +
{children}
+ +
+ ); +} diff --git a/app/(auth)/layout.tsx b/app/(auth)/layout.tsx new file mode 100644 index 0000000..c36e6dc --- /dev/null +++ b/app/(auth)/layout.tsx @@ -0,0 +1,13 @@ +import Link from 'next/link'; +import { t } from '@/lib/i18n'; + +export default function AuthLayout({ children }: { children: React.ReactNode }) { + return ( +
+ + {t('brand.name')} + +
{children}
+
+ ); +} diff --git a/app/(auth)/login/page.tsx b/app/(auth)/login/page.tsx new file mode 100644 index 0000000..3b76b82 --- /dev/null +++ b/app/(auth)/login/page.tsx @@ -0,0 +1,15 @@ +import { Suspense } from 'react'; +import { redirect } from 'next/navigation'; +import { AuthForm } from '@/components/AuthForm'; +import { getCurrentUser } from '@/lib/server/auth'; + +export const dynamic = 'force-dynamic'; + +export default async function LoginPage() { + if (await getCurrentUser()) redirect('/dashboard'); + return ( + Loading…

}> + +
+ ); +} diff --git a/app/(auth)/register/page.tsx b/app/(auth)/register/page.tsx new file mode 100644 index 0000000..2ffbaee --- /dev/null +++ b/app/(auth)/register/page.tsx @@ -0,0 +1,15 @@ +import { Suspense } from 'react'; +import { redirect } from 'next/navigation'; +import { AuthForm } from '@/components/AuthForm'; +import { getCurrentUser } from '@/lib/server/auth'; + +export const dynamic = 'force-dynamic'; + +export default async function RegisterPage() { + if (await getCurrentUser()) redirect('/dashboard'); + return ( + Loading…

}> + +
+ ); +} diff --git a/app/(marketing)/authors/[slug]/page.tsx b/app/(marketing)/authors/[slug]/page.tsx new file mode 100644 index 0000000..c2fefde --- /dev/null +++ b/app/(marketing)/authors/[slug]/page.tsx @@ -0,0 +1,51 @@ +import type { Metadata } from 'next'; +import { notFound } from 'next/navigation'; +import { getAuthorWithPosts } from '@/lib/server/content'; +import { PostCard } from '@/components/content/PostCard'; +import { EmptyState } from '@/components/ui'; +import { t } from '@/lib/i18n'; + +export const dynamic = 'force-dynamic'; + +type Params = { params: Promise<{ slug: string }> }; + +export async function generateMetadata({ params }: Params): Promise { + const { slug } = await params; + const data = await getAuthorWithPosts(slug); + if (!data) return { title: 'Author not found' }; + return { title: `${data.author.name}`, description: data.author.bio ?? `Posts by ${data.author.name}.` }; +} + +export default async function AuthorPage({ params }: Params) { + const { slug } = await params; + const data = await getAuthorWithPosts(slug); + if (!data) notFound(); + + return ( +
+
+ +
+

{t('author.postsBy', { name: data.author.name })}

+ {data.author.bio &&

{data.author.bio}

} +
+
+ + {data.posts.length === 0 ? ( + {t('common.empty')} + ) : ( +
+ {data.posts.map((post) => ( + + ))} +
+ )} +
+ ); +} diff --git a/app/(marketing)/blog/[slug]/page.tsx b/app/(marketing)/blog/[slug]/page.tsx new file mode 100644 index 0000000..465623e --- /dev/null +++ b/app/(marketing)/blog/[slug]/page.tsx @@ -0,0 +1,99 @@ +import type { Metadata } from 'next'; +import Link from 'next/link'; +import { notFound } from 'next/navigation'; +import { getPublishedPost, listRelatedPosts } from '@/lib/server/content'; +import { Markdown } from '@/components/content/Markdown'; +import { Toc } from '@/components/content/Toc'; +import { PostCard } from '@/components/content/PostCard'; +import { extractHeadings } from '@/lib/content'; +import { formatDate } from '@/lib/utils'; +import { t } from '@/lib/i18n'; + +export const dynamic = 'force-dynamic'; + +type Params = { params: Promise<{ slug: string }> }; + +export async function generateMetadata({ params }: Params): Promise { + const { slug } = await params; + const post = await getPublishedPost(slug); + if (!post) return { title: 'Post not found' }; + return { + title: post.title, + description: post.excerpt, + openGraph: { + type: 'article', + title: post.title, + description: post.excerpt, + publishedTime: post.publishedAt?.toISOString(), + modifiedTime: post.updatedAt.toISOString(), + authors: [post.author.name], + tags: post.tags.map(({ tag }) => tag.name), + }, + }; +} + +export default async function PostPage({ params }: Params) { + const { slug } = await params; + const post = await getPublishedPost(slug); + if (!post) notFound(); + + const base = (process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000').replace(/\/$/, ''); + const headings = extractHeadings(post.body); + const related = await listRelatedPosts(post); + + const jsonLd = { + '@context': 'https://schema.org', + '@type': 'Article', + headline: post.title, + description: post.excerpt, + datePublished: post.publishedAt?.toISOString(), + dateModified: post.updatedAt.toISOString(), + author: { '@type': 'Person', name: post.author.name, url: `${base}/authors/${post.author.slug}` }, + keywords: post.tags.map(({ tag }) => tag.name).join(', '), + mainEntityOfPage: `${base}/blog/${post.slug}`, + url: `${base}/blog/${post.slug}`, + }; + + return ( +
+