Update PRD

This commit is contained in:
Justin Edmund 2025-05-26 18:55:14 -07:00
parent 75974f1750
commit 322427c118

View file

@ -47,9 +47,17 @@ CREATE TABLE projects (
CREATE TABLE posts ( CREATE TABLE posts (
id SERIAL PRIMARY KEY, id SERIAL PRIMARY KEY,
slug VARCHAR(255) UNIQUE NOT NULL, slug VARCHAR(255) UNIQUE NOT NULL,
title VARCHAR(255) NOT NULL, post_type VARCHAR(50) NOT NULL, -- blog, microblog, link, photo, album
content JSONB NOT NULL, -- BlockNote JSON format title VARCHAR(255), -- Optional for microblog posts
content JSONB, -- BlockNote JSON for blog/microblog, optional for others
excerpt TEXT, excerpt TEXT,
-- Type-specific fields
link_url VARCHAR(500), -- For link posts
link_description TEXT, -- For link posts
photo_id INTEGER REFERENCES photos(id), -- For photo posts
album_id INTEGER REFERENCES albums(id), -- For album posts
featured_image VARCHAR(500), featured_image VARCHAR(500),
tags JSONB, -- Array of tags tags JSONB, -- Array of tags
status VARCHAR(50) DEFAULT 'draft', status VARCHAR(50) DEFAULT 'draft',
@ -85,6 +93,15 @@ CREATE TABLE photos (
exif_data JSONB, exif_data JSONB,
caption TEXT, caption TEXT,
display_order INTEGER DEFAULT 0, display_order INTEGER DEFAULT 0,
-- Individual publishing support
slug VARCHAR(255) UNIQUE, -- Only if published individually
title VARCHAR(255), -- Optional title for individual photos
description TEXT, -- Longer description when published solo
status VARCHAR(50) DEFAULT 'draft',
published_at TIMESTAMP,
show_in_photos BOOLEAN DEFAULT true, -- Show in photos page when published solo
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
); );
@ -404,13 +421,112 @@ const handleImageUpload = async (file) => {
- [ ] Individual content pages - [ ] Individual content pages
- [ ] SEO meta tags - [ ] SEO meta tags
## Open Questions ## Design Decisions
1. Should Albums have a "featured" flag for homepage display?
2. Do we want version history for content? Based on requirements discussion:
3. Should photos support individual publishing vs entire albums?
4. How should we handle project case study layouts (templates)? 1. **Albums**: No featured flag needed
5. Do we need scheduled publishing? 2. **Version History**: Nice-to-have feature for future implementation
6. Should Universe support different post types (link posts, quotes)? 3. **Photo Publishing**: Individual photos can be published separately from albums
4. **Project Templates**: Defer case study layout templates for later phase
5. **Scheduled Publishing**: Not needed initially
6. **RSS Feeds**: Required for all content types (projects, posts, photos)
7. **Post Types**: Universe will support multiple post types:
- **Blog Post**: Title + long-form BlockNote content
- **Microblog**: No title, short-form BlockNote content
- **Link Post**: URL + optional commentary
- **Photo Post**: Single photo + caption
- **Album Post**: Reference to photo album
## Phased Implementation Plan
### Phase 1: Database & Infrastructure Setup
- [ ] Set up PostgreSQL on Railway
- [ ] Create all database tables with updated schema
- [ ] Set up Prisma ORM with models
- [ ] Configure Cloudinary account and API keys
- [ ] Create base API route structure
- [ ] Implement database connection utilities
- [ ] Set up error handling and logging
### Phase 2: Media Management System
- [ ] Create media upload endpoint with Cloudinary integration
- [ ] Implement image processing pipeline (multiple sizes)
- [ ] Build media library API endpoints
- [ ] Create media association tracking system
- [ ] Implement EXIF data extraction for photos
- [ ] Add bulk upload endpoint for photos
- [ ] Create media usage tracking queries
### Phase 3: Admin Foundation
- [ ] Create admin layout component
- [ ] Build admin navigation with content type switcher
- [ ] Implement admin authentication (basic for now)
- [ ] Create reusable form components
- [ ] Build data table component for list views
- [ ] Add loading and error states
- [ ] Create media library modal component
### Phase 4: Posts System (All Types)
- [ ] Create BlockNote Svelte wrapper component
- [ ] Implement custom image block for BlockNote
- [ ] Build post type selector UI
- [ ] Create blog/microblog post editor
- [ ] Build link post form
- [ ] Create photo post selector
- [ ] Build album post selector
- [ ] Implement post CRUD APIs
- [ ] Add auto-save functionality
- [ ] Create post list view in admin
### Phase 5: Projects System
- [ ] Build project form with all metadata fields
- [ ] Create technology tag selector
- [ ] Implement featured image picker
- [ ] Build gallery manager with drag-and-drop ordering
- [ ] Add optional BlockNote editor for case studies
- [ ] Create project CRUD APIs
- [ ] Build project list view with thumbnails
- [ ] Add project ordering functionality
### Phase 6: Photos & Albums System
- [ ] Create album management interface
- [ ] Build bulk photo uploader with progress
- [ ] Implement drag-and-drop photo ordering
- [ ] Add individual photo publishing UI
- [ ] Create photo/album CRUD APIs
- [ ] Build photo metadata editor
- [ ] Implement album cover selection
- [ ] Add "show in universe" toggle for albums
### Phase 7: Public Display Updates
- [ ] Replace static Work page with dynamic data
- [ ] Update project detail pages
- [ ] Build Universe mixed feed component
- [ ] Create different card types for each post type
- [ ] Update Photos page with dynamic albums/photos
- [ ] Implement individual photo pages
- [ ] Add Universe post detail pages
- [ ] Ensure responsive design throughout
### Phase 8: RSS Feeds & Final Polish
- [ ] Implement RSS feed for projects
- [ ] Create RSS feed for Universe posts
- [ ] Add RSS feed for photos/albums
- [ ] Implement combined RSS feed
- [ ] Add OpenGraph meta tags
- [ ] Optimize image loading and caching
- [ ] Add search functionality to admin
- [ ] Performance optimization pass
- [ ] Final testing on Railway
### Future Enhancements (Post-Launch)
- [ ] Version history system
- [ ] More robust authentication
- [ ] Project case study templates
- [ ] Advanced media organization (folders/tags)
- [ ] Analytics integration
- [ ] Backup system
## Success Metrics ## Success Metrics
- Can create and publish any content type within 2-3 minutes - Can create and publish any content type within 2-3 minutes
@ -419,4 +535,5 @@ const handleImageUpload = async (file) => {
- No accidental data loss (auto-save works reliably) - No accidental data loss (auto-save works reliably)
- Page load performance remains fast (<2s) - Page load performance remains fast (<2s)
- Admin interface works well on tablet/desktop - Admin interface works well on tablet/desktop
- Media uploads show progress and handle failures gracefully - Media uploads show progress and handle failures gracefully
- RSS feeds update automatically with new content