From c64f7ffa9ebe6fa6e2d0a1057e40146984179e51 Mon Sep 17 00:00:00 2001 From: w4c-templates Date: Sun, 11 Oct 2026 23:25:34 +0300 Subject: [PATCH] chore(template): publish Admin.Next --- .dockerignore | 12 + .env.example | 15 + .eslintrc.json | 7 + .github/workflows/ci.yml | 33 + .gitignore | 11 + .w4c/preview.png | Bin 0 -> 78897 bytes .w4c/qa.json | 38 + .w4c/template.json | 28 + README.md | 66 +- 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)/layout.tsx | 12 + app/(marketing)/legal/privacy/page.tsx | 10 + app/(marketing)/legal/terms/page.tsx | 10 + app/(marketing)/page.tsx | 44 + app/(marketing)/pricing/page.tsx | 74 + app/admin/audit/page.tsx | 62 + app/admin/customers/page.tsx | 10 + app/admin/deals/page.tsx | 10 + app/admin/import/page.tsx | 10 + app/admin/layout.tsx | 31 + app/admin/page.tsx | 75 + app/admin/users/page.tsx | 51 + app/api/admin/audit/route.ts | 23 + app/api/admin/customers/[id]/route.ts | 48 + app/api/admin/customers/route.ts | 34 + app/api/admin/deals/[id]/route.ts | 38 + app/api/admin/deals/route.ts | 28 + app/api/admin/export/customers/route.ts | 18 + app/api/admin/import/customers/route.ts | 21 + 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/sitemap.ts | 12 + components/AdminNav.tsx | 30 + components/AuthForm.tsx | 79 + components/SiteFooter.tsx | 25 + components/SiteHeader.tsx | 49 + components/ThemeToggle.tsx | 41 + components/UpgradeButton.tsx | 43 + components/admin/CustomersManager.tsx | 298 + components/admin/DealsManager.tsx | 273 + components/admin/ImportWizard.tsx | 182 + components/admin/UserActions.tsx | 44 + components/ui/index.tsx | 68 + docker/Dockerfile | 23 + docker/docker-compose.yml | 15 + lib/csv.ts | 107 + lib/env.ts | 20 + lib/i18n.ts | 19 + lib/password.ts | 10 + lib/plans.ts | 41 + lib/rbac.ts | 24 + lib/server/audit.ts | 15 + lib/server/auth.ts | 75 + lib/server/crm.ts | 178 + lib/server/db.ts | 8 + lib/server/email.ts | 44 + lib/server/guard.ts | 40 + lib/server/payments.ts | 86 + lib/utils.ts | 21 + messages/en.json | 141 + middleware.ts | 28 + next.config.ts | 26 + package-lock.json | 8771 +++++++++++++++++++++++ package.json | 46 + postcss.config.mjs | 5 + prisma/schema.prisma | 83 + prisma/seed.ts | 74 + public/favicon.svg | 4 + tests/e2e/smoke.mjs | 113 + tests/unit/auth.test.ts | 19 + tests/unit/csv.test.ts | 55 + tests/unit/plans.test.ts | 22 + tsconfig.json | 21 + vitest.config.ts | 12 + 91 files changed, 12691 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)/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/admin/audit/page.tsx create mode 100644 app/admin/customers/page.tsx create mode 100644 app/admin/deals/page.tsx create mode 100644 app/admin/import/page.tsx create mode 100644 app/admin/layout.tsx create mode 100644 app/admin/page.tsx create mode 100644 app/admin/users/page.tsx create mode 100644 app/api/admin/audit/route.ts create mode 100644 app/api/admin/customers/[id]/route.ts create mode 100644 app/api/admin/customers/route.ts create mode 100644 app/api/admin/deals/[id]/route.ts create mode 100644 app/api/admin/deals/route.ts create mode 100644 app/api/admin/export/customers/route.ts create mode 100644 app/api/admin/import/customers/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/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/CustomersManager.tsx create mode 100644 components/admin/DealsManager.tsx create mode 100644 components/admin/ImportWizard.tsx create mode 100644 components/admin/UserActions.tsx create mode 100644 components/ui/index.tsx create mode 100644 docker/Dockerfile create mode 100644 docker/docker-compose.yml create mode 100644 lib/csv.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/crm.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/csv.test.ts create mode 100644 tests/unit/plans.test.ts create mode 100644 tsconfig.json 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..325de68 --- /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, 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..c2539802175285fa1f81a6bbb9ccdbac7e6cd546 GIT binary patch literal 78897 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[M@_IL!XbLAnCA4m?8 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 H&x8I8-ecji literal 0 HcmV?d00001 diff --git a/.w4c/qa.json b/.w4c/qa.json new file mode 100644 index 0000000..1cf3494 --- /dev/null +++ b/.w4c/qa.json @@ -0,0 +1,38 @@ +{ + "install": "npm ci", + "setup": "npm run db:setup", + "lint": "npm run lint", + "typecheck": "npm run typecheck", + "unit": "npm run test", + "build": "npm run build", + "start": "npm run start", + "e2e": "node tests/e2e/smoke.mjs", + "port": 3000, + "health": "/api/health", + "env": { + "DATABASE_URL": "file:./dev.db", + "NEXT_PUBLIC_SITE_URL": "http://localhost:3000" + }, + "routes": [ + { "path": "/", "expect": [200] }, + { "path": "/pricing", "expect": [200] }, + { "path": "/login", "expect": [200] }, + { "path": "/register", "expect": [200] }, + { "path": "/legal/privacy", "expect": [200] }, + { "path": "/dashboard", "expect": [307, 302] }, + { "path": "/admin", "expect": [307, 302] }, + { "path": "/admin/customers", "expect": [307, 302] }, + { "path": "/admin/deals", "expect": [307, 302] }, + { "path": "/admin/import", "expect": [307, 302] }, + { "path": "/admin/audit", "expect": [307, 302] }, + { "path": "/admin/users", "expect": [307, 302] }, + { "path": "/api/health", "expect": [200] }, + { "path": "/api/auth/me", "expect": [401] }, + { "path": "/api/admin/customers", "expect": [401] }, + { "path": "/api/admin/audit", "expect": [401] }, + { "path": "/api/admin/export/customers", "expect": [401] }, + { "path": "/sitemap.xml", "expect": [200] }, + { "path": "/robots.txt", "expect": [200] } + ], + "timeout": { "install": 900, "build": 900, "boot": 120 } +} diff --git a/.w4c/template.json b/.w4c/template.json new file mode 100644 index 0000000..8c15c57 --- /dev/null +++ b/.w4c/template.json @@ -0,0 +1,28 @@ +{ + "schema": 2, + "system": "v2", + "id": "admin-next", + "case": "admin", + "stack": "next", + "title": "Admin / CRM — Next.js", + "description": "Ready-to-run internal tool: an entity registry with CRUD, roles, CSV import/export and an audit log.", + "tags": ["internal", "crm", "admin", "csv"], + "preview": ".w4c/preview.png", + "demoUrl": "https://admin-next.demo.wiz4chat.com", + "agentId": "w4c-start2", + "defaultName": "my-crm", + "featured": true, + "env": [ + { "key": "DATABASE_URL", "required": false, "note": "SQLite by default; Postgres in production" }, + { "key": "NEXT_PUBLIC_SITE_URL", "required": false, "note": "Public origin for sitemap/OG" } + ], + "modules": [ + { "id": "s3-storage", "skill": "integration-s3-storage" }, + { "id": "resend-email", "skill": "integration-resend-email" } + ], + "seededAccounts": [ + { "role": "admin", "email": "admin@example.com", "password": "password" }, + { "role": "editor", "email": "editor@example.com", "password": "password" }, + { "role": "viewer", "email": "viewer@example.com", "password": "password" } + ] +} diff --git a/README.md b/README.md index 5396bdb..603a633 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,65 @@ -# templates2.Admin.Next +# Admin / CRM — Next.js (templates2) -Ready-to-run internal tool: an entity registry with CRUD, roles, CSV import/export and an audit log. \ No newline at end of file +A **ready-to-run** internal tool built on the v2 Next.js base: an entity registry (Customers, +Deals) with CRUD, roles, CSV import/export and an audit log. Everything works on the first run — +SQLite + mock providers need no keys. + +## Quickstart + +```bash +npm ci +cp .env.example .env # SQLite + mock providers by default — no keys needed +npm run db:setup # prisma db push + seed (20 customers, 15 deals, audit trail) +npm run dev # http://localhost:3000/admin +``` + +## Demo accounts (seeded) + +| Role | Email | Password | Can do | +|---|---|---|---| +| admin | `admin@example.com` | `password` | read, create/edit, delete, import/export | +| editor | `editor@example.com` | `password` | read, create/edit, import/export | +| viewer | `viewer@example.com` | `password` | read only | + +Roles are enforced **server-side** on every admin API route (`lib/server/guard.ts` + +`lib/rbac.ts`); the UI merely hides what a role cannot do. + +## What this case adds on top of the base + +- **Entity registry** — `Customer` and `Deal` with list (search, column filter, sort, pagination), + detail, create/edit and delete (delete asks for confirmation). `components/admin/CustomersManager` + and `DealsManager` drive the `/admin/customers` and `/admin/deals` pages. +- **Dashboard** — counters (customers, leads, deals, won value), a deals-by-stage bar chart and + recent activity on `/admin` (`lib/server/crm.ts#overview`). +- **CSV import** — `/admin/import` validates a CSV, shows a per-row error report and a preview of + the first valid rows, then commits. Export is a `text/csv` download. +- **Audit log** — every mutation writes an `AuditLog` row (`lib/server/audit.ts`); `/admin/audit` + lists it and filters by action. +- **Loading / empty / error states** on every list and the import wizard. + +## API + +| Method | Path | Role | +|---|---|---| +| GET | `/api/admin/customers?q=&status=&sort=&page=` | viewer+ | +| POST | `/api/admin/customers` | editor+ | +| GET / PATCH / DELETE | `/api/admin/customers/:id` | viewer+ / editor+ / admin | +| GET / POST | `/api/admin/deals` | viewer+ / editor+ | +| PATCH / DELETE | `/api/admin/deals/:id` | editor+ / admin | +| POST | `/api/admin/import/customers` (`{ csv, commit }`) | editor+ | +| GET | `/api/admin/export/customers` | viewer+ | +| GET | `/api/admin/audit?action=` | viewer+ | + +## Data model + +`prisma/schema.prisma`: the base `User`, `Session`, `Subscription`, `AuditLog` plus `Customer` +and `Deal`. SQLite in development; point `DATABASE_URL` at Postgres for production. + +## Quality + +```bash +node ../templates2/qa.mjs Admin.Next # from the repo root: node templates2/qa.mjs Admin.Next +``` + +The harness runs validate → clone → install → lint → typecheck → unit → 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)/layout.tsx b/app/(marketing)/layout.tsx new file mode 100644 index 0000000..b77354a --- /dev/null +++ b/app/(marketing)/layout.tsx @@ -0,0 +1,12 @@ +import { SiteHeader } from '@/components/SiteHeader'; +import { SiteFooter } from '@/components/SiteFooter'; + +export default function MarketingLayout({ children }: { children: React.ReactNode }) { + return ( +
+ +
{children}
+ +
+ ); +} diff --git a/app/(marketing)/legal/privacy/page.tsx b/app/(marketing)/legal/privacy/page.tsx new file mode 100644 index 0000000..0bfe977 --- /dev/null +++ b/app/(marketing)/legal/privacy/page.tsx @@ -0,0 +1,10 @@ +export default function PrivacyPage() { + return ( +
+

Privacy Policy

+

+ This is a placeholder legal page. Replace it with your own policy before going live. +

+
+ ); +} diff --git a/app/(marketing)/legal/terms/page.tsx b/app/(marketing)/legal/terms/page.tsx new file mode 100644 index 0000000..65d9a97 --- /dev/null +++ b/app/(marketing)/legal/terms/page.tsx @@ -0,0 +1,10 @@ +export default function TermsPage() { + return ( +
+

Terms of Service

+

+ This is a placeholder legal page. Replace it with your own terms before going live. +

+
+ ); +} diff --git a/app/(marketing)/page.tsx b/app/(marketing)/page.tsx new file mode 100644 index 0000000..95c8fea --- /dev/null +++ b/app/(marketing)/page.tsx @@ -0,0 +1,44 @@ +import Link from 'next/link'; +import { t } from '@/lib/i18n'; + +const features = ['auth', 'billing', 'admin', 'seo'] as const; + +export default function HomePage() { + const jsonLd = { + '@context': 'https://schema.org', + '@type': 'WebSite', + name: t('brand.name'), + url: process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000', + }; + return ( + <> +