111 lines
3.3 KiB
Markdown
111 lines
3.3 KiB
Markdown
# Backend Updates Summary
|
|
|
|
## Database Schema Changes
|
|
|
|
### Posts Table - New Fields Added
|
|
|
|
1. **`ghost_slug`** (VARCHAR(255), nullable)
|
|
- Stores the Ghost post slug for association
|
|
- Used to link VoxBlog posts with their Ghost counterparts
|
|
|
|
2. **`ghost_published_at`** (DATETIME(3), nullable)
|
|
- Timestamp when the post was published to Ghost
|
|
- Helps track publication history
|
|
|
|
3. **`selected_image_keys`** (TEXT, nullable)
|
|
- JSON array of selected image keys for the post
|
|
- Persists user's image selection for the Generate step
|
|
- Stored as JSON string, parsed on retrieval
|
|
|
|
### Migration File
|
|
- **Location**: `apps/api/drizzle/0001_jittery_revanche.sql`
|
|
- **Status**: ✅ Migration has been generated and applied
|
|
|
|
```sql
|
|
ALTER TABLE `posts` ADD `ghost_slug` varchar(255);
|
|
ALTER TABLE `posts` ADD `ghost_published_at` datetime(3);
|
|
ALTER TABLE `posts` ADD `selected_image_keys` text;
|
|
```
|
|
|
|
**To apply this migration** (if needed on other environments):
|
|
```bash
|
|
cd apps/api
|
|
pnpm drizzle:migrate
|
|
```
|
|
|
|
## API Endpoint Changes
|
|
|
|
### 1. GET `/api/posts/:id`
|
|
**Added Response Fields:**
|
|
- `ghostPostId`: string | null
|
|
- `ghostSlug`: string | null
|
|
- `ghostPublishedAt`: Date | null
|
|
- `ghostUrl`: string | null
|
|
- `selectedImageKeys`: string[] (parsed from JSON)
|
|
|
|
### 2. POST `/api/posts`
|
|
**Added Request Body Fields:**
|
|
- `selectedImageKeys`: string[] (optional)
|
|
- `ghostPostId`: string (optional)
|
|
- `ghostSlug`: string (optional)
|
|
- `ghostPublishedAt`: string (optional, ISO date string)
|
|
- `ghostUrl`: string (optional)
|
|
|
|
**Behavior:**
|
|
- `selectedImageKeys` is serialized to JSON before storage
|
|
- Ghost fields are only updated if provided in the request
|
|
- All fields are nullable and optional
|
|
|
|
### 3. GET `/api/media/list`
|
|
**Added Query Parameters:**
|
|
- `page`: number (default: 1, min: 1)
|
|
- `pageSize`: number (default: 50, min: 1, max: 200)
|
|
|
|
**Updated Response:**
|
|
```json
|
|
{
|
|
"items": [...],
|
|
"total": number,
|
|
"page": number,
|
|
"pageSize": number
|
|
}
|
|
```
|
|
|
|
**Note:** Due to S3 limitations, pagination fetches `page * pageSize` items and slices them. For large datasets, consider implementing cursor-based pagination or caching.
|
|
|
|
## Files Modified
|
|
|
|
1. **`apps/api/src/db/schema.ts`**
|
|
- Added new fields to posts table definition
|
|
|
|
2. **`apps/api/src/posts.ts`**
|
|
- Updated GET endpoint to return new fields
|
|
- Updated POST endpoint to accept and store new fields
|
|
- Added JSON serialization/deserialization for `selectedImageKeys`
|
|
|
|
3. **`apps/api/src/media.ts`**
|
|
- Added pagination support to `/list` endpoint
|
|
- Implemented page and pageSize query parameters
|
|
|
|
## Testing Checklist
|
|
|
|
- [x] Run database migration ✅
|
|
- [ ] Test POST `/api/posts` with `selectedImageKeys` array
|
|
- [ ] Test GET `/api/posts/:id` returns `selectedImageKeys` as array
|
|
- [ ] Test POST `/api/posts` with Ghost fields
|
|
- [ ] Test GET `/api/media/list?page=1&pageSize=50`
|
|
- [ ] Test GET `/api/media/list?page=2&pageSize=50`
|
|
- [ ] Verify `selectedImageKeys` persists across save/load cycles
|
|
- [ ] Verify Ghost fields update correctly on publish
|
|
|
|
## Frontend Integration
|
|
|
|
The frontend has been updated to:
|
|
1. Send `selectedImageKeys` when saving posts
|
|
2. Load `selectedImageKeys` when opening posts
|
|
3. Use pagination for media library
|
|
4. Update post status after Ghost publish
|
|
5. Auto-upload audio recordings
|
|
|
|
All frontend changes are complete and ready to work with these backend updates.
|