How aforardi/mohammadardi-portfolio works
This is a single Next.js portfolio app with an owner dashboard. Visitors load published portfolio content and can preview or download the resume; the owner signs in with password and authenticator MFA, then edits content, uploads media, and manages video cards. The dashboard’s API routes enforce owner access and persist changes, while public pages render published data. The README documents additional editable collections and contact-provider configuration. Several UI-to-API and unsampled subsystem connections are not visible in the excerpts, so those links are omitted rather than inferred.
Main entry points: index.ts PostgreSQL data · [collection]/route.ts Content API · upload/route.ts Upload API · mutations.ts Content mutations
Components 26
Public portfolio
- Portfolio page
app/(public)/page.tsx - Portfolio sections
src/components/ProjectsSection.tsx - Published content
src/lib/content/public.ts - Contact form
src/components/ContactSection.tsx
Owner content
- Content studio
src/components/admin/ContentStudio.tsx - Content API
app/api/admin/content/[collection]/route.ts - Content mutations
src/lib/content/mutations.ts - Content validation
src/lib/content/validation.ts
Owner security
- Owner login
app/(auth)/admin/login/page.tsx - Login form
src/components/admin/LoginForm.tsx - Owner access guard
src/lib/auth/guard.ts - Supabase Auth
Media and integrations
- PostgreSQL data
src/db/index.ts - Portfolio schema
src/db/schema.ts - Upload API
app/api/admin/upload/route.ts - Image processing
src/lib/storage/images.ts - Supabase Storage
src/lib/storage/client.ts - Published media endpoint
app/api/media/[type]/[id]/route.ts - Resume endpoint
app/api/resume/route.ts - Resume delivery
src/lib/storage/resume.ts - Storage cleanup
src/lib/storage/cleanup.ts - YouTube preview API
app/api/admin/youtube/preview/route.ts - YouTube metadata
src/lib/youtube/service.ts - Email and CAPTCHA
Other components
- Visitor
- Portfolio owner
Connections 30
- Visitor → Portfolio page: opens
- Portfolio page → Published content: loads content
app/(public)/page.tsx - Portfolio page → Portfolio sections: renders sections
app/(public)/page.tsx - Published content → PostgreSQL data: reads published data
- PostgreSQL data → Portfolio schema: uses schema
src/db/index.ts - Portfolio owner → Owner login: signs in
- Owner login → Login form: renders form
app/(auth)/admin/login/page.tsx - Login form → Supabase Auth: authenticates
- Content API → Owner access guard: checks owner
app/api/admin/content/[collection]/route.ts - Owner access guard → Supabase Auth: verifies identity
src/lib/auth/guard.ts - Content API → PostgreSQL data: reads and writes
app/api/admin/content/[collection]/route.ts - Content API → Content mutations: saves content
app/api/admin/content/[collection]/route.ts - Content API → Content validation: validates deletion
app/api/admin/content/[collection]/route.ts - Content mutations → PostgreSQL data: updates records
src/lib/content/mutations.ts - Content mutations → Supabase Storage: moves media
src/lib/content/mutations.ts - Content mutations → YouTube metadata: fetches metadata
src/lib/content/mutations.ts - Upload API → Owner access guard: checks owner
app/api/admin/upload/route.ts - Upload API → Image processing: prepares images
app/api/admin/upload/route.ts - Upload API → Supabase Storage: uploads files
app/api/admin/upload/route.ts - Upload API → PostgreSQL data: records assets
app/api/admin/upload/route.ts - Published media endpoint → PostgreSQL data: reads asset records
app/api/media/[type]/[id]/route.ts - Published media endpoint → Supabase Storage: serves files
app/api/media/[type]/[id]/route.ts - Visitor → Resume endpoint: requests resume
- Resume endpoint → PostgreSQL data: reads resume asset
app/api/resume/route.ts - Resume endpoint → Resume delivery: delegates delivery
app/api/resume/route.ts - Resume endpoint → Supabase Storage: downloads PDF
app/api/resume/route.ts - Content API → Storage cleanup: drains queue
app/api/admin/content/[collection]/route.ts - YouTube preview API → Owner access guard: checks owner
app/api/admin/youtube/preview/route.ts - YouTube preview API → YouTube metadata: fetches preview
app/api/admin/youtube/preview/route.ts - Contact form → Email and CAPTCHA: submits inquiry