Skip to content

Commit 47bd998

Browse files
committed
Can only have 1 resource review
1 parent 24fbfbd commit 47bd998

4 files changed

Lines changed: 46 additions & 11 deletions

File tree

app/Http/Controllers/ResourceReviewController.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,29 @@
88
use App\Models\ResourceReview;
99
use Auth;
1010
use Illuminate\Support\Facades\Log;
11+
use Redirect;
1112

1213
class ResourceReviewController extends Controller
1314
{
1415
// Store the review on the resource
1516
public function store(StoreResourceReview $request, ComputerScienceResource $computerScienceResource)
1617
{
17-
Log::debug("Storing resource review: " . json_encode($request));
18-
1918
// Validate the request data
2019
$validatedData = $request->validated();
2120

21+
$existingReview = ResourceReview::where([
22+
'user_id' => Auth::id(),
23+
'computer_science_resource_id' => $computerScienceResource->id,
24+
])->first();
25+
26+
if ($existingReview) {
27+
Log::debug("User has already posted a review");
28+
// TODO: Make it a json with errors instead
29+
return back()->with('warning', 'You already have a review posted, you should edit your existing one instead.');
30+
}
31+
32+
Log::debug("Storing resource review: " . json_encode($validatedData));
33+
2234
// Create the resource review
2335
$review = ResourceReview::create([
2436
'user_id' => Auth::id(),
@@ -37,6 +49,7 @@ public function store(StoreResourceReview $request, ComputerScienceResource $com
3749

3850
ResourceReviewProcessed::dispatch($computerScienceResource->id, null, $review->attributesToArray());
3951

52+
// Json with success
4053
return to_route('resources.show', ['computerScienceResource' => $review->computer_science_resource_id])
4154
->with('success', 'Review created successfully!');
4255
}

database/factories/ResourceReviewFactory.php

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,7 @@ class ResourceReviewFactory extends Factory
2020
public function definition(): array
2121
{
2222
return [
23-
'user_id' => function () {
24-
return User::inRandomOrder()->firstOr(function () {
25-
return User::factory()->create();
26-
})->id;
27-
},
23+
'user_id' => User::factory()->create()->id, // Is creating a new user since we need users to be unique per review
2824
'computer_science_resource_id' => function () {
2925
return ComputerScienceResource::firstOr(function () {
3026
return ComputerScienceResource::factory()->create();

database/migrations/2025_02_14_225555_create_resource_reviews_table.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ public function up(): void
1717
$table->id();
1818
$table->foreignIdFor(User::class)->index();
1919
$table->foreignIdFor(ComputerScienceResource::class)->index();
20+
21+
$table->unique([
22+
'user_id',
23+
'computer_science_resource_id'
24+
]);
2025

2126
// Text
2227
$table->string('title');

tests/Feature/ResourceReviewsTest.php

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,18 +67,39 @@ public function test_resource_review_can_be_posted(): void
6767

6868
$data = ResourceReviewTestResource::fake();
6969

70-
$response = $this->actingAs($user)
70+
$this->actingAs($user)
7171
->post(route('reviews.store', $resource), $data);
7272

73-
$response->assertRedirect(route('resources.show', ['computerScienceResource' => $resource->id]))
74-
->assertSessionHas('success', 'Review created successfully!');
75-
7673
$this->assertDatabaseHas('resource_reviews', [
7774
'computer_science_resource_id' => $resource->id,
7875
'title' => $data['title']
7976
]);
8077
}
8178

79+
public function test_resource_review_cannot_be_posted_twice(): void
80+
{
81+
$user = User::factory()->create();
82+
$resource = ComputerScienceResource::factory()->create();
83+
84+
$data1 = ResourceReviewTestResource::fake();
85+
$this->actingAs($user)
86+
->post(route('reviews.store', $resource), $data1);
87+
88+
$this->assertDatabaseHas('resource_reviews', [
89+
'computer_science_resource_id' => $resource->id,
90+
'title' => $data1['title']
91+
]);
92+
93+
$data2 = ResourceReviewTestResource::fake();
94+
$this->actingAs($user)
95+
->post(route('reviews.store', $resource), $data2);
96+
97+
$this->assertDatabaseMissing('resource_reviews', [
98+
'computer_science_resource_id' => $resource->id,
99+
'title' => $data2['title']
100+
]);
101+
}
102+
82103
public function test_resource_average_has_changed(): void
83104
{
84105
$user = User::factory()->create();

0 commit comments

Comments
 (0)