From fa6d769daa60c27d0b09ce99b3f6797f2837a37d Mon Sep 17 00:00:00 2001 From: Romulus21 Date: Sun, 9 Aug 2020 18:48:13 +0200 Subject: [PATCH] finish basic crud api --- app/Http/Controllers/EventController.php | 39 +++----- app/Http/Requests/EventRequest.php | 3 +- app/Policies/EventPolicy.php | 94 +++++++++++++++++++ app/Providers/AuthServiceProvider.php | 1 + database/factories/EventCategoryFactory.php | 13 +++ database/factories/EventFactory.php | 23 +++++ .../2020_07_19_085105_create_events_table.php | 1 + tests/Feature/BookmarkTest.php | 2 +- tests/Feature/EventsTest.php | 80 ++++++++++++++++ 9 files changed, 229 insertions(+), 27 deletions(-) create mode 100644 app/Policies/EventPolicy.php create mode 100644 database/factories/EventCategoryFactory.php create mode 100644 database/factories/EventFactory.php diff --git a/app/Http/Controllers/EventController.php b/app/Http/Controllers/EventController.php index 88e9576..34acf4a 100644 --- a/app/Http/Controllers/EventController.php +++ b/app/Http/Controllers/EventController.php @@ -19,16 +19,6 @@ class EventController extends Controller // } - /** - * Show the form for creating a new resource. - * - * @return \Illuminate\Http\Response - */ - public function create() - { - // - } - /** * Store a newly created resource in storage. * @@ -60,27 +50,22 @@ class EventController extends Controller ->setStatusCode(200); } - /** - * Show the form for editing the specified resource. - * - * @param \App\Models\Event $event - * @return \Illuminate\Http\Response - */ - public function edit(Event $event) - { - // - } - /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param \App\Models\Event $event - * @return \Illuminate\Http\Response + * @return \Illuminate\Http\JsonResponse */ - public function update(Request $request, Event $event) + public function update(EventRequest $request, Event $event) { - // + $this->authorize('update', $event); + + $event->update($request->all()); + + return (new EventResource($event)) + ->response() + ->setStatusCode(200); } /** @@ -91,6 +76,10 @@ class EventController extends Controller */ public function destroy(Event $event) { - // + $this->authorize('delete', $event); + + $event->delete(); + + return response([], 204); } } diff --git a/app/Http/Requests/EventRequest.php b/app/Http/Requests/EventRequest.php index 879f6ab..e21ef46 100644 --- a/app/Http/Requests/EventRequest.php +++ b/app/Http/Requests/EventRequest.php @@ -27,8 +27,9 @@ class EventRequest extends FormRequest 'name' => 'required', 'description' => 'nullable|string', 'category_id' => 'required|exists:event_categories,id', + 'private' => 'boolean', 'start_date' => 'required|date', - 'end_date' => 'date|after_or_equal:start_date', + 'end_date' => 'date|after_or_equal:start_date|nullable', 'location' => 'string|nullable' ]; } diff --git a/app/Policies/EventPolicy.php b/app/Policies/EventPolicy.php new file mode 100644 index 0000000..e3b5940 --- /dev/null +++ b/app/Policies/EventPolicy.php @@ -0,0 +1,94 @@ +id == $event->user_id; + } + + /** + * Determine whether the user can delete the model. + * + * @param \App\User $user + * @param \App\Models\Event $event + * @return mixed + */ + public function delete(User $user, Event $event) + { + return $user->id == $event->user_id; + } + + /** + * Determine whether the user can restore the model. + * + * @param \App\User $user + * @param \App\Models\Event $event + * @return mixed + */ + public function restore(User $user, Event $event) + { + return false; + } + + /** + * Determine whether the user can permanently delete the model. + * + * @param \App\User $user + * @param \App\Models\Event $event + * @return mixed + */ + public function forceDelete(User $user, Event $event) + { + return false; + } +} diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 5012a59..da6366f 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -19,6 +19,7 @@ class AuthServiceProvider extends ServiceProvider 'App\Models\Memo' => 'App\Policies\MemoPolicy', 'App\Models\ToDoList' => 'App\Policies\ToDoListPolicy', 'App\Models\Bookmark' => 'App\Policies\BookmarkPolicy', + 'App\Models\Event' => 'App\Policies\EventPolicy', ]; /** diff --git a/database/factories/EventCategoryFactory.php b/database/factories/EventCategoryFactory.php new file mode 100644 index 0000000..aa770cd --- /dev/null +++ b/database/factories/EventCategoryFactory.php @@ -0,0 +1,13 @@ +define(EventCategory::class, function (Faker $faker) { + return [ + 'name' => $faker->words(3, [false]), + 'description' => $faker->words(rand(10, 30), [false]), + ]; +}); diff --git a/database/factories/EventFactory.php b/database/factories/EventFactory.php new file mode 100644 index 0000000..96c9e7e --- /dev/null +++ b/database/factories/EventFactory.php @@ -0,0 +1,23 @@ +define(Event::class, function (Faker $faker) { + $startDate = $faker->dateTimeThisMonth; + $endDate = $faker->dateTimeBetween($startDate, date_add($startDate, date_interval_create_from_date_string('10 days'))); + $endDate = (rand(0, 1) === 0) ? null : $endDate; + return [ + 'user_id' => factory(\App\User::class), + 'category_id' => factory(EventCategory::class), + 'name' => $faker->words(3, [false]), + 'description' => $faker->words(rand(10, 300), [false]), + 'private' => rand(0,1), + 'start_date' => $startDate, + 'end_date' => $endDate, + 'location' => $faker->city, + ]; +}); diff --git a/database/migrations/2020_07_19_085105_create_events_table.php b/database/migrations/2020_07_19_085105_create_events_table.php index 6239ca5..f592391 100644 --- a/database/migrations/2020_07_19_085105_create_events_table.php +++ b/database/migrations/2020_07_19_085105_create_events_table.php @@ -19,6 +19,7 @@ class CreateEventsTable extends Migration $table->unsignedBigInteger('category_id'); $table->string('name'); $table->text('description')->nullable(); + $table->boolean('private')->default(true); $table->timestamp('start_date'); $table->timestamp('end_date')->nullable(); $table->string('location')->nullable(); diff --git a/tests/Feature/BookmarkTest.php b/tests/Feature/BookmarkTest.php index 79b0c8f..ccd9a90 100644 --- a/tests/Feature/BookmarkTest.php +++ b/tests/Feature/BookmarkTest.php @@ -80,7 +80,7 @@ class BookmarkTest extends TestCase } /** @test */ - public function a_user_can_retrueved_all_this_to_do_lists() + public function a_user_can_retrieved_all_this_to_do_lists() { $this->actingAs($user = factory(User::class)->create(), 'api'); $bookmarkOne = factory(Bookmark::class)->create(['user_id' => $user->id]); diff --git a/tests/Feature/EventsTest.php b/tests/Feature/EventsTest.php index 44663f9..86fbdb7 100644 --- a/tests/Feature/EventsTest.php +++ b/tests/Feature/EventsTest.php @@ -306,6 +306,85 @@ class EventsTest extends TestCase ]); } + /** @test */ + public function a_to_event_can_be_patch() + { + $this->withoutExceptionHandling(); + $this->actingAs($user = factory(User::class)->create(), 'api'); + $event = factory(Event::class)->create(['user_id' => $user->id]); + + $response = $this->patch('/api/events/' . $event->id, [ + 'category_id' => $event->category_id, + 'name' => 'Event Update', + 'description' => 'Event Update description', + 'start_date' => '2020-07-20 09:00:00', + ]); + + $event = $event->fresh(); + + $this->assertEquals('Event Update', $event->name); + $this->assertEquals('Event Update description', $event->description); + + $response->assertStatus(200); + $response->assertJson([ + 'data' => [ + 'event_id' => $event->id, + 'attributes' => [ + 'data' => [ + 'name' => 'Event Update', + 'description' => 'Event Update description', + 'start_date' => '2020-07-20 09:00:00', + 'category' => [ + 'data' => [ + 'category_id' => $event->category_id, + ], + ], + ] + ] + ] + ]); + } + + /** @test */ + public function only_the_owner_can_patch_the_event() + { + $user = factory(User::class)->create(); + $event = factory(Event::class)->create(['id' => 123, 'user_id' => $user->id]); + + $this->actingAs($anotherUser = factory(User::class)->create(), 'api'); + + $this->patch('/api/events/'. $event->id, $this->data()) + ->assertStatus(403); + } + + /** @test */ + public function a_event_can_be_delete() + { + $this->actingAs($user = factory(User::class)->create(), 'api'); + + $event = factory(Event::class)->create(['user_id' => $user->id]); + + $response = $this->delete('/api/events/' . $event->id); + + $event = $event->fresh(); + + $this->assertCount(0, Event::all()); + + $response->assertStatus(204); + } + + /** @test */ + public function only_the_owner_can_delete_the_bookmark() + { + $user = factory(User::class)->create(); + $event = factory(Event::class)->create(); + + $this->actingAs($anotherUser = factory(User::class)->create(), 'api'); + + $response = $this->delete('/api/events/' . $event->id); + + $response->assertStatus(403); + } private function data() { @@ -313,6 +392,7 @@ class EventsTest extends TestCase 'name' => 'Test name event', 'description' => 'Test description event', 'category_id' => 1, + 'private' => false, 'start_date' => '2020-07-20 09:00:00', 'end_date' => '2020-07-26 09:00:00', 'location' => 'Marcillac',