finish basic crud api

This commit is contained in:
2020-08-09 18:48:13 +02:00
parent 644dbd9ea2
commit fa6d769daa
9 changed files with 229 additions and 27 deletions

View File

@@ -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);
}
}

View File

@@ -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'
];
}

View File

@@ -0,0 +1,94 @@
<?php
namespace App\Policies;
use App\Models\Event;
use App\User;
use Illuminate\Auth\Access\HandlesAuthorization;
class EventPolicy
{
use HandlesAuthorization;
/**
* Determine whether the user can view any models.
*
* @param \App\User $user
* @return mixed
*/
public function viewAny(User $user)
{
return true;
}
/**
* Determine whether the user can view the model.
*
* @param \App\User $user
* @param \App\Models\Event $event
* @return mixed
*/
public function view(User $user, Event $event)
{
return true;
}
/**
* Determine whether the user can create models.
*
* @param \App\User $user
* @return mixed
*/
public function create(User $user)
{
return true;
}
/**
* Determine whether the user can update the model.
*
* @param \App\User $user
* @param \App\Models\Event $event
* @return mixed
*/
public function update(User $user, Event $event)
{
return $user->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;
}
}

View File

@@ -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',
];
/**

View File

@@ -0,0 +1,13 @@
<?php
/** @var \Illuminate\Database\Eloquent\Factory $factory */
use App\Models\EventCategory;
use Faker\Generator as Faker;
$factory->define(EventCategory::class, function (Faker $faker) {
return [
'name' => $faker->words(3, [false]),
'description' => $faker->words(rand(10, 30), [false]),
];
});

View File

@@ -0,0 +1,23 @@
<?php
/** @var \Illuminate\Database\Eloquent\Factory $factory */
use App\Models\Event;
use App\Models\EventCategory;
use Faker\Generator as Faker;
$factory->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,
];
});

View File

@@ -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();

View File

@@ -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]);

View File

@@ -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',