Files
thrillwiki_laravel/memory-bank/models/ReviewModels.md
2025-02-25 21:28:57 -05:00

3.9 KiB

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

// 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.