Skip to content

Commit 97a2cdd

Browse files
committed
feat: split event logic between Instructor and Driver
- add new relationships eg. instructor has many drivers - create separate controller for management events by instructor and get events by driver - add route for listing drivers of instructor - prefix event routes with roles - make migration foreignId to users table - embed driver details to api response for instructor - validate if driver belongs to instructor when storing, updating or deleting data
1 parent 384454c commit 97a2cdd

14 files changed

+248
-79
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace App\Http\Controllers;
4+
5+
use App\Http\Resources\DriverEventResource;
6+
use App\Models\Event;
7+
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
8+
use Illuminate\Http\Request;
9+
10+
class DriverEventController extends Controller
11+
{
12+
use AuthorizesRequests;
13+
14+
public function index(Request $request)
15+
{
16+
$driver = $request->user();
17+
$events = $driver->events;
18+
19+
return DriverEventResource::collection($events);
20+
}
21+
}

app/Http/Controllers/EventController.php

Lines changed: 0 additions & 69 deletions
This file was deleted.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace App\Http\Controllers;
4+
5+
use Illuminate\Http\Request;
6+
use App\Http\Resources\DriverResource;
7+
8+
class InstructorDriverController extends Controller
9+
{
10+
/**
11+
* Display a listing of the instructor's drivers.
12+
*/
13+
public function index(Request $request)
14+
{
15+
$instructor = $request->user();
16+
$drivers = $instructor->drivers()->get();
17+
18+
return DriverResource::collection($drivers);
19+
}
20+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
<?php
2+
3+
namespace App\Http\Controllers;
4+
5+
use App\Http\Resources\DriverEventResource;
6+
use App\Http\Resources\InstructorEventResource;
7+
use App\Models\Event;
8+
use App\Models\User;
9+
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
10+
use Illuminate\Http\Request;
11+
12+
class InstructorEventController extends Controller
13+
{
14+
use AuthorizesRequests;
15+
16+
/**
17+
* Display a listing of the resource.
18+
*/
19+
public function index(Request $request)
20+
{
21+
$instructor = $request->user();
22+
23+
$driverIds = $instructor->drivers->pluck('id');
24+
25+
$events = Event::whereIn('user_id', $driverIds)->with('driver')->get();
26+
27+
return InstructorEventResource::collection($events);
28+
}
29+
30+
/**
31+
* Store a newly created resource in storage.
32+
*/
33+
public function store(Request $request)
34+
{
35+
$validated = $request->validate([
36+
'driver_id' => 'required|exists:users,id',
37+
'title' => 'required|string|max:255',
38+
'start' => 'required|date',
39+
'end' => 'required|date',
40+
]);
41+
42+
$instructor = $request->user();
43+
44+
if (!$instructor->drivers()->where('id', $validated['driver_id'])->exists()) {
45+
return response()->json(['message' => 'Unauthorized driver'], 403);
46+
}
47+
48+
$driver = User::find($validated['driver_id']);
49+
50+
$event = $driver->events()->create([
51+
'title' => $validated['title'],
52+
'start' => $validated['start'],
53+
'end' => $validated['end'],
54+
]);
55+
$event->load('driver');
56+
57+
return response()->json(new InstructorEventResource($event), 201);
58+
}
59+
60+
/**
61+
* Update the specified resource in storage.
62+
*/
63+
public function update(Request $request, Event $event)
64+
{
65+
$instructor = $request->user();
66+
if (!$instructor->drivers()->where('id', $event->user_id)->exists()) {
67+
return response()->json(['message' => 'Unauthorized event'], 403);
68+
}
69+
70+
$validated = $request->validate([
71+
'title' => 'required|string|max:255',
72+
'start' => 'required|date',
73+
'end' => 'required|date',
74+
]);
75+
76+
$event->update($validated);
77+
$event->load('driver');
78+
79+
return response()->json(new InstructorEventResource($event));
80+
}
81+
82+
/**
83+
* Remove the specified resource from storage.
84+
*/
85+
public function destroy(Request $request, Event $event)
86+
{
87+
$instructor = $request->user();
88+
if (!$instructor->drivers()->where('id', $event->user_id)->exists()) {
89+
return response()->json(['message' => 'Unauthorized event'], 403);
90+
}
91+
92+
$this->authorize('delete', $event);
93+
94+
$event->delete();
95+
96+
return response()->noContent();
97+
}
98+
}

app/Http/Resources/EventResource.php renamed to app/Http/Resources/DriverEventResource.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use Illuminate\Http\Request;
66
use Illuminate\Http\Resources\Json\JsonResource;
77

8-
class EventResource extends JsonResource
8+
class DriverEventResource extends JsonResource
99
{
1010
/**
1111
* Transform the resource into an array.

app/Http/Resources/DriverResource.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace App\Http\Resources;
4+
5+
use Illuminate\Http\Request;
6+
use Illuminate\Http\Resources\Json\JsonResource;
7+
8+
class DriverResource extends JsonResource
9+
{
10+
public function toArray(Request $request): array
11+
{
12+
return [
13+
'id' => $this->id,
14+
'name' => $this->name,
15+
];
16+
}
17+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace App\Http\Resources;
4+
5+
use Illuminate\Http\Request;
6+
use Illuminate\Http\Resources\Json\JsonResource;
7+
8+
class InstructorEventResource extends JsonResource
9+
{
10+
/**
11+
* Transform the resource into an array.
12+
*
13+
* @return array<string, mixed>
14+
*/
15+
public function toArray(Request $request): array
16+
{
17+
return [
18+
'id' => $this->id,
19+
'driver' => new DriverResource($this->whenLoaded('driver')),
20+
'title' => $this->title,
21+
'start' => $this->start,
22+
'end' => $this->end,
23+
];
24+
}
25+
}

app/Models/Course.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Illuminate\Database\Eloquent\Factories\HasFactory;
88
use Illuminate\Database\Eloquent\Model;
99
use Illuminate\Database\Eloquent\Relations\BelongsTo;
10+
use Illuminate\Database\Eloquent\Relations\HasMany;
1011

1112
/**
1213
* @property int $id
@@ -41,4 +42,9 @@ public function category(): BelongsTo
4142
{
4243
return $this->belongsTo(Category::class);
4344
}
45+
46+
public function drivers(): HasMany
47+
{
48+
return $this->hasMany(User::class, 'course_id');
49+
}
4450
}

app/Models/Event.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
namespace App\Models;
44

55
use Illuminate\Database\Eloquent\Model;
6+
use Illuminate\Database\Eloquent\Relations\BelongsTo;
67

78
class Event extends Model
89
{
910
protected $fillable = ['title', 'start', 'end', 'user_id'];
1011

11-
public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo
12+
public function driver(): BelongsTo
1213
{
13-
return $this->belongsTo(User::class);
14+
return $this->belongsTo(User::class, 'user_id');
1415
}
1516
}

app/Models/User.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// use Illuminate\Contracts\Auth\MustVerifyEmail;
66
use Database\Factories\UserFactory;
77
use Illuminate\Database\Eloquent\Factories\HasFactory;
8+
use Illuminate\Database\Eloquent\Relations\BelongsTo;
89
use Illuminate\Database\Eloquent\Relations\HasMany;
910
use Illuminate\Database\Eloquent\Relations\HasOne;
1011
use Illuminate\Foundation\Auth\User as Authenticatable;
@@ -68,4 +69,20 @@ public function events(): HasMany
6869
{
6970
return $this->hasMany(Event::class);
7071
}
72+
73+
public function course(): BelongsTo
74+
{
75+
return $this->belongsTo(Course::class);
76+
}
77+
78+
public function instructor(): BelongsTo
79+
{
80+
return $this->belongsTo(User::class, 'instructor_id');
81+
}
82+
83+
public function drivers(): HasMany
84+
{
85+
return $this->hasMany(User::class, 'instructor_id');
86+
}
87+
7188
}

0 commit comments

Comments
 (0)