Files
thrilltrack-explorer/migration/PHASE_05_REVIEWS_SOCIAL.md

288 lines
8.4 KiB
Markdown

# PHASE 5: Reviews & Social Features
**Status:** ⬜ Not Started
**Estimated Time:** 12-15 hours
**Priority:** HIGH
**Depends On:** Phase 1 (Foundation), Phase 4 (Entity Services)
**Blocks:** Phase 12 (Pages Migration)
---
## 🎯 Goal
Build service layer for reviews, ride credits, and top lists to replace ALL Supabase queries related to social features.
---
## 📋 Tasks
### Task 5.1: Reviews Service (5 hours)
**File:** `src/services/reviews/reviewsService.ts`
#### Create Core Service
```typescript
class ReviewsService extends BaseService {
// GET /reviews/
async getReviews(filters: ReviewFilters): Promise<PaginatedResponse<Review>>
// GET /reviews/{id}/
async getReview(id: string): Promise<Review>
// POST /reviews/ (creates submission)
async submitReview(data: ReviewSubmissionData): Promise<ContentSubmission>
// PATCH /reviews/{id}/ (creates submission)
async updateReview(id: string, data: Partial<ReviewData>): Promise<ContentSubmission>
// DELETE /reviews/{id}/ (creates submission)
async deleteReview(id: string, reason: string): Promise<ContentSubmission>
// POST /reviews/{id}/helpful/
async markHelpful(reviewId: string): Promise<void>
// DELETE /reviews/{id}/helpful/
async unmarkHelpful(reviewId: string): Promise<void>
// GET /reviews/?entity_type=ride&entity_id={id}
async getEntityReviews(entityType: string, entityId: string): Promise<Review[]>
// GET /reviews/?user_id={id}
async getUserReviews(userId: string): Promise<Review[]>
}
```
#### Checklist
- [ ] Create `reviewsService.ts` with all methods
- [ ] Create `types.ts` for Review types
- [ ] Create `mappers.ts` for API ↔ Frontend transformations
- [ ] Add error handling for all endpoints
- [ ] Implement proper TypeScript types
- [ ] Export from `src/services/reviews/index.ts`
---
### Task 5.2: Ride Credits Service (3 hours)
**File:** `src/services/rideCredits/rideCreditsService.ts`
#### Create Core Service
```typescript
class RideCreditsService extends BaseService {
// GET /ride-credits/
async getRideCredits(userId: string): Promise<UserRideCredit[]>
// GET /ride-credits/{id}/
async getRideCredit(id: string): Promise<UserRideCredit>
// POST /ride-credits/ (creates submission)
async submitRideCredit(data: RideCreditData): Promise<ContentSubmission>
// PATCH /ride-credits/{id}/ (creates submission)
async updateRideCredit(id: string, data: Partial<RideCreditData>): Promise<ContentSubmission>
// DELETE /ride-credits/{id}/ (creates submission)
async deleteRideCredit(id: string): Promise<ContentSubmission>
// GET /ride-credits/?ride_id={id}
async getRideRideCredits(rideId: string): Promise<UserRideCredit[]>
}
```
#### Checklist
- [ ] Create `rideCreditsService.ts` with all methods
- [ ] Create types for ride credits
- [ ] Create mappers for API transformations
- [ ] Handle submission creation properly
- [ ] Export from `src/services/rideCredits/index.ts`
---
### Task 5.3: Top Lists Service (4 hours)
**File:** `src/services/topLists/topListsService.ts`
#### Create Core Service
```typescript
class TopListsService extends BaseService {
// GET /top-lists/
async getTopLists(filters?: TopListFilters): Promise<UserTopList[]>
// GET /top-lists/{id}/
async getTopList(id: string): Promise<UserTopList>
// POST /top-lists/
async createTopList(data: TopListData): Promise<UserTopList>
// PATCH /top-lists/{id}/
async updateTopList(id: string, data: Partial<TopListData>): Promise<UserTopList>
// DELETE /top-lists/{id}/
async deleteTopList(id: string): Promise<void>
// GET /top-lists/{id}/items/
async getTopListItems(listId: string): Promise<UserTopListItem[]>
// POST /top-lists/{id}/items/
async addTopListItem(listId: string, item: TopListItemData): Promise<UserTopListItem>
// PATCH /top-lists/{id}/items/reorder/
async reorderTopListItems(listId: string, itemIds: string[]): Promise<void>
// DELETE /top-lists/{id}/items/{itemId}/
async removeTopListItem(listId: string, itemId: string): Promise<void>
// GET /top-lists/?user_id={id}
async getUserTopLists(userId: string): Promise<UserTopList[]>
}
```
#### Checklist
- [ ] Create `topListsService.ts` with all methods
- [ ] Create types for top lists and items
- [ ] Create mappers for API transformations
- [ ] Handle reordering logic
- [ ] Handle item CRUD operations
- [ ] Export from `src/services/topLists/index.ts`
---
### Task 5.4: Update Review Components (3 hours)
**Files to Update:**
- `src/components/reviews/ReviewForm.tsx`
- `src/components/reviews/ReviewsList.tsx`
- `src/components/reviews/ReviewCard.tsx`
- `src/components/reviews/HelpfulButton.tsx`
#### Checklist
- [ ] Replace `supabase.from('reviews')` with `reviewsService`
- [ ] Update review submission to use service
- [ ] Update helpful votes to use service
- [ ] Update review deletion to use service
- [ ] Test review CRUD operations
- [ ] Verify error handling works
---
### Task 5.5: Update Ride Credit Components (2 hours)
**Files to Update:**
- `src/components/profile/RideCreditsManager.tsx`
- `src/components/profile/AddRideCreditDialog.tsx`
- `src/components/profile/RideCreditCard.tsx`
#### Checklist
- [ ] Replace all Supabase calls with `rideCreditsService`
- [ ] Update submission flow to use service
- [ ] Test adding ride credits
- [ ] Test editing ride credits
- [ ] Test deleting ride credits
- [ ] Verify moderation queue receives submissions
---
### Task 5.6: Update Top Lists Components (3 hours)
**Files to Update:**
- `src/components/lists/UserListManager.tsx`
- `src/components/lists/ListDisplay.tsx`
- `src/components/lists/ListItemEditor.tsx`
- `src/components/lists/ListSearch.tsx`
#### Checklist
- [ ] Replace all Supabase calls with `topListsService`
- [ ] Update list CRUD operations
- [ ] Update item reordering logic
- [ ] Test creating/editing lists
- [ ] Test adding/removing/reordering items
- [ ] Verify list sharing works (if implemented)
---
## 🎯 Success Criteria
### Service Layer
- [ ] All three services (reviews, rideCredits, topLists) created
- [ ] All services extend BaseService
- [ ] All services have proper TypeScript types
- [ ] All services have error handling
- [ ] All services have mappers for API transformations
### Components
- [ ] Zero `supabase.from('reviews')` calls
- [ ] Zero `supabase.from('user_ride_credits')` calls
- [ ] Zero `supabase.from('user_top_lists')` calls
- [ ] Zero `supabase.from('user_top_list_items')` calls
- [ ] All review operations work
- [ ] All ride credit operations work
- [ ] All top list operations work
### Testing
- [ ] Can create a review (goes to moderation)
- [ ] Can mark review as helpful
- [ ] Can add a ride credit (goes to moderation)
- [ ] Can create a top list
- [ ] Can add items to top list
- [ ] Can reorder top list items
- [ ] Can delete top list items
- [ ] Can delete entire top list
### Sacred Pipeline
- [ ] Review submissions go through moderation
- [ ] Review updates go through moderation
- [ ] Review deletions go through moderation
- [ ] Ride credit submissions go through moderation
- [ ] Pipeline integrity maintained
---
## 📝 Implementation Notes
### Review Submissions
- Reviews are user-generated content and MUST go through the Sacred Pipeline
- Use `reviewsService.submitReview()` which creates a ContentSubmission
- Only approved reviews appear in the system
### Ride Credits
- Ride credits are also user-generated and MUST go through moderation
- Users claim they've ridden a ride, moderators verify
- Auto-crediting on review approval should still work
### Top Lists
- Top lists are personal user content
- May NOT require moderation (check with backend team)
- Item reordering is immediate (no moderation)
### Helpful Votes
- Marking a review as helpful is immediate (no moderation)
- Backend tracks vote counts automatically
- Each user can only vote once per review
---
## 🔗 Related Files
### Services
- `src/services/reviews/reviewsService.ts`
- `src/services/reviews/types.ts`
- `src/services/reviews/mappers.ts`
- `src/services/rideCredits/rideCreditsService.ts`
- `src/services/topLists/topListsService.ts`
### Components
- All files in `src/components/reviews/`
- All files in `src/components/profile/` (ride credits)
- All files in `src/components/lists/` (top lists)
### Hooks
- `src/hooks/useReviews.ts`
- `src/hooks/useRideCredits.ts`
- `src/hooks/useTopLists.ts`
---
## ⏭️ Next Phase
**Phase 6:** Moderation & Admin - Create moderation service and update moderation queue components.