Skip to content

Commit

Permalink
refactor: moved data handling logic from service to value objects
Browse files Browse the repository at this point in the history
  • Loading branch information
frooooooo7 committed Jan 14, 2025
1 parent 9c88018 commit f46dc80
Show file tree
Hide file tree
Showing 8 changed files with 131 additions and 22 deletions.
8 changes: 4 additions & 4 deletions app/Http/Controllers/CourseRegistrationController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace App\Http\Controllers;

use App\Http\Requests\StoreCourseRegistrationRequest;
use App\Http\Requests\UpdateCourseRegistrationRequest;
use App\Http\Resources\CourseRegistrationCollection;
use App\Http\Resources\CourseRegistrationResource;
Expand All @@ -16,14 +17,13 @@ public function index(): CourseRegistrationCollection
return new CourseRegistrationCollection($this->courseRegistrationService->index());
}

public function store($courseId): CourseRegistrationResource
public function store(StoreCourseRegistrationRequest $request, $courseId): CourseRegistrationResource
{
return new CourseRegistrationResource($this->courseRegistrationService->create($courseId));

return new CourseRegistrationResource($this->courseRegistrationService->create($request->getCourseRegistration($courseId)));
}

public function update(UpdateCourseRegistrationRequest $request, $registrationId): CourseRegistrationResource
{
return new CourseRegistrationResource($this->courseRegistrationService->update($request->updateStatus(), $registrationId));
return new CourseRegistrationResource($this->courseRegistrationService->update($request->getCourseRegistration(), $registrationId));
}
}
35 changes: 35 additions & 0 deletions app/Http/Requests/StoreCourseRegistrationRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

namespace App\Http\Requests;

use App\ValueObjects\CreateCourseRegistration;
use Illuminate\Foundation\Http\FormRequest;

class StoreCourseRegistrationRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}

/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [];
}

public function getCourseRegistration(int $courseId): CreateCourseRegistration
{
return new CreateCourseRegistration(
$courseId,
auth()->id()
);
}
}
8 changes: 5 additions & 3 deletions app/Http/Requests/UpdateCourseRegistrationRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
namespace App\Http\Requests;

use App\Enums\RegistrationStatus;
use App\ValueObjects\CreateNewCourse;
use App\ValueObjects\UpdateCourseRegistration;
use Illuminate\Foundation\Http\FormRequest;

class UpdateCourseRegistrationRequest extends FormRequest
Expand Down Expand Up @@ -30,9 +32,9 @@ public function rules(): array
],
];
}

public function updateStatus(): array
public function getCourseRegistration(): UpdateCourseRegistration
{
return $this->validated();
$status = RegistrationStatus::from($this->get('status'));
return new UpdateCourseRegistration($status);
}
}
4 changes: 4 additions & 0 deletions app/Models/CourseRegistration.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,14 @@
namespace App\Models;

use App\Enums\RegistrationStatus;
use Database\Factories\CourseRegistrationFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class CourseRegistration extends Model
{
/** @use HasFactory<CourseRegistrationFactory> */
use HasFactory;
protected $fillable = [
'course_id',
'user_id',
Expand Down
23 changes: 8 additions & 15 deletions app/Services/CourseRegistrationService.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

namespace App\Services;

use App\Enums\RegistrationStatus;
use App\Models\Course;
use App\Models\CourseRegistration;
use App\ValueObjects\CreateCourseRegistration;
use App\ValueObjects\UpdateCourseRegistration;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth;

class CourseRegistrationService
{
Expand All @@ -14,24 +15,16 @@ public function index(): Collection
return CourseRegistration::all();
}

public function create($courseId): CourseRegistration
public function create(CreateCourseRegistration $data): CourseRegistration
{
$user = Auth::user();
$registration = CourseRegistration::create([
'course_id' => $courseId,
'user_id' => $user->id,
'status' => RegistrationStatus::PENDING->value,
]);

return $registration;
Course::findOrFail($data->getCourseId()); // check if course exists
return CourseRegistration::create($data->toArray());
}

public function update(array $data, $registrationId): CourseRegistration
public function update(UpdateCourseRegistration $data, $registrationId): CourseRegistration
{
$registration = CourseRegistration::findOrFail($registrationId);
$registration->status = $data['status'];
$registration->save();

$registration->update($data->toArray());
return $registration;
}
}
27 changes: 27 additions & 0 deletions app/ValueObjects/CreateCourseRegistration.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace App\ValueObjects;

use App\Enums\RegistrationStatus;
use Illuminate\Contracts\Support\Arrayable;
final readonly class CreateCourseRegistration implements Arrayable
{
public function __construct(private int $courseId, private int $userId) {}

public function getCourseId(): int
{
return $this->courseId;
}
public function getUserId(): int
{
return $this->userId;
}
public function toArray(): array
{
return [
'course_id' => $this->getCourseId(),
'user_id' => $this->getUserId(),
'status' => RegistrationStatus::PENDING->value,
];
}
}
20 changes: 20 additions & 0 deletions app/ValueObjects/UpdateCourseRegistration.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace App\ValueObjects;

use App\Enums\RegistrationStatus;
use Illuminate\Contracts\Support\Arrayable;

final readonly class UpdateCourseRegistration implements Arrayable{
public function __construct(private RegistrationStatus $status) {}

public function getStatus(): RegistrationStatus{
return $this->status;
}

public function toArray(): array {
return [
'status' => $this->getStatus()->value
];
}
}
28 changes: 28 additions & 0 deletions database/factories/CourseRegistrationFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

namespace Database\Factories;

use App\Enums\RegistrationStatus;
use App\Models\Course;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;

/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\CourseRegistration>
*/
class CourseRegistrationFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'course_id' => Course::factory(),
'user_id' => User::factory(),
'status' => RegistrationStatus::PENDING->value,
];
}
}

0 comments on commit f46dc80

Please sign in to comment.