mirror of
https://github.com/pacnpal/thrillwiki_laravel.git
synced 2025-12-20 05:31:10 -05:00
134 lines
3.9 KiB
Markdown
134 lines
3.9 KiB
Markdown
# Review System Models
|
|
|
|
## Review Model
|
|
Represents user reviews for rides in the system.
|
|
|
|
### Properties
|
|
- `id` (int) - Primary key
|
|
- `ride_id` (int) - Foreign key to rides table
|
|
- `user_id` (int) - Foreign key to users table
|
|
- `rating` (int) - Rating from 1 to 5
|
|
- `title` (string, nullable) - Optional review title
|
|
- `content` (text) - Review content
|
|
- `status` (enum) - ReviewStatus enum value
|
|
- `moderated_at` (timestamp) - When review was moderated
|
|
- `moderated_by` (int) - Foreign key to users table (moderator)
|
|
- `helpful_votes_count` (int) - Counter cache for helpful votes
|
|
|
|
### Relationships
|
|
- `ride` - BelongsTo relationship to Ride model
|
|
- `user` - BelongsTo relationship to User model
|
|
- `moderator` - BelongsTo relationship to User model
|
|
- `helpfulVotes` - HasMany relationship to HelpfulVote model
|
|
|
|
### Scopes
|
|
- `pending()` - Reviews awaiting moderation
|
|
- `approved()` - Approved reviews
|
|
- `rejected()` - Rejected reviews
|
|
- `byRide()` - Filter by ride
|
|
- `byUser()` - Filter by user
|
|
|
|
### Methods
|
|
- `approve()` - Approve the review
|
|
- `reject()` - Reject the review
|
|
- `moderate()` - General moderation method
|
|
- `toggleHelpfulVote()` - Toggle helpful vote from a user
|
|
|
|
## HelpfulVote Model
|
|
Represents users marking reviews as helpful.
|
|
|
|
### Properties
|
|
- `id` (int) - Primary key
|
|
- `review_id` (int) - Foreign key to reviews table
|
|
- `user_id` (int) - Foreign key to users table
|
|
- `created_at` (timestamp) - When vote was cast
|
|
|
|
### Relationships
|
|
- `review` - BelongsTo relationship to Review model
|
|
- `user` - BelongsTo relationship to User model
|
|
|
|
### Methods
|
|
- `toggle()` - Toggle vote status
|
|
|
|
## Database Considerations
|
|
|
|
### Indexes
|
|
1. Reviews Table:
|
|
- Primary Key: id
|
|
- Foreign Keys: ride_id, user_id, moderated_by
|
|
- Composite: [ride_id, user_id] (unique)
|
|
- Indexes: [ride_id, status], [user_id, created_at], status
|
|
|
|
2. Helpful Votes Table:
|
|
- Primary Key: id
|
|
- Foreign Keys: review_id, user_id
|
|
- Composite: [review_id, user_id] (unique)
|
|
- Indexes: [user_id, created_at]
|
|
|
|
### Constraints
|
|
1. Reviews:
|
|
- One review per ride per user
|
|
- Rating must be between 1 and 5
|
|
- Status must be valid enum value
|
|
- Content is required
|
|
|
|
2. Helpful Votes:
|
|
- One vote per review per user
|
|
- Cascading deletes with review
|
|
|
|
## Usage Examples
|
|
|
|
```php
|
|
// Create a review
|
|
$review = Review::create([
|
|
'ride_id' => $ride->id,
|
|
'user_id' => Auth::id(),
|
|
'rating' => 5,
|
|
'title' => 'Great ride!',
|
|
'content' => 'This was amazing...',
|
|
]);
|
|
|
|
// Toggle helpful vote
|
|
$review->toggleHelpfulVote(Auth::id());
|
|
|
|
// Moderate a review
|
|
$review->moderate(ReviewStatus::APPROVED, Auth::id());
|
|
|
|
// Get ride's approved reviews
|
|
$reviews = $ride->reviews()->approved()->latest()->get();
|
|
|
|
// Get user's helpful votes
|
|
$votes = $user->helpfulVotes()->with('review')->get();
|
|
```
|
|
|
|
## Implementation Notes
|
|
|
|
### Review Model Implementation
|
|
|
|
The Review model has been implemented in `app/Models/Review.php` with the following features:
|
|
|
|
- Fillable properties for all required fields
|
|
- Proper type casting for enum values and timestamps
|
|
- All relationships defined as specified (ride, user, moderator, helpfulVotes)
|
|
- Query scopes for filtering by status and relationships
|
|
- Methods for moderation and helpful vote management
|
|
|
|
### HelpfulVote Model Implementation
|
|
|
|
The HelpfulVote model has been implemented in `app/Models/HelpfulVote.php` with:
|
|
|
|
- Minimal properties (review_id, user_id)
|
|
- Relationships to Review and User models
|
|
- Static toggle method for easy vote management
|
|
|
|
### Ride Model Enhancements
|
|
|
|
The Ride model has been enhanced with review-related functionality:
|
|
|
|
- Added reviews() and approvedReviews() relationships
|
|
- Implemented getAverageRatingAttribute() for easy access to average ratings
|
|
- Added getReviewCountAttribute() for counting approved reviews
|
|
- Created canBeReviewedBy() method to check if a user can review a ride
|
|
- Implemented addReview() method for creating new reviews
|
|
|
|
These implementations maintain feature parity with the Django implementation while leveraging Laravel's Eloquent ORM features. |