Skip to content

Commit ce2f75d

Browse files
committed
merge dev into branch and resolve conflicts
2 parents e56fc36 + b25f05f commit ce2f75d

32 files changed

+853
-8
lines changed

app/Enums/RegistrationStatus.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace App\Enums;
4+
5+
enum RegistrationStatus: string
6+
{
7+
case PENDING = 'pending';
8+
case ACCEPTED = 'accepted';
9+
case REJECTED = 'rejected';
10+
11+
// get all enum values as an array
12+
public static function values(): array
13+
{
14+
return array_column(self::cases(), 'value');
15+
}
16+
17+
public static function acceptedAndRejectedValues(): array
18+
{
19+
return [
20+
self::ACCEPTED->value,
21+
self::REJECTED->value,
22+
];
23+
}
24+
}

app/Filters/FullNameFilter.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace App\Filters;
4+
5+
use Illuminate\Database\Eloquent\Builder;
6+
use Spatie\QueryBuilder\Filters\Filter;
7+
8+
class FullNameFilter implements Filter
9+
{
10+
public function __invoke(Builder $query, $value, string $property): void
11+
{
12+
$value = strtolower(trim($value));
13+
14+
$parts = preg_split('/\s+/', $value); // rozdzielenie po spacjach (zeby wyszukiwalo jesli podamy i imie, i nazwisko)
15+
16+
$query->where(function ($q) use ($parts) {
17+
if (count($parts) === 1) {
18+
$q->whereRaw('LOWER(name) LIKE ?', ["%{$parts[0]}%"])
19+
->orWhereRaw('LOWER(last_name) LIKE ?', ["%{$parts[0]}%"]);
20+
} else {
21+
foreach ($parts as $part) {
22+
$q->where(function ($subQ) use ($part) {
23+
$subQ->whereRaw('LOWER(name) LIKE ?', ["%{$part}%"])
24+
->orWhereRaw('LOWER(last_name) LIKE ?', ["%{$part}%"]);
25+
});
26+
}
27+
}
28+
});
29+
}
30+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Admin;
4+
5+
use App\Filters\FullNameFilter;
6+
use App\Http\Controllers\Controller;
7+
use App\Http\Resources\UserCollection;
8+
use App\Models\User;
9+
use Spatie\QueryBuilder\AllowedFilter;
10+
use Spatie\QueryBuilder\QueryBuilder;
11+
12+
class AdminStudentController extends Controller
13+
{
14+
public function __construct() {}
15+
16+
public function index(): UserCollection
17+
{
18+
return new UserCollection(QueryBuilder::for(User::role('driver'))
19+
->allowedFilters(AllowedFilter::custom('search', new FullNameFilter))
20+
->paginate(self::PER_PAGE));
21+
}
22+
}

app/Http/Controllers/AuthController.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Illuminate\Http\JsonResponse;
1313
use Illuminate\Http\Request;
1414
use Illuminate\Support\Facades\Hash;
15+
use Illuminate\Support\Facades\Log;
1516
use Illuminate\Validation\ValidationException;
1617
use Symfony\Component\HttpFoundation\Response;
1718

@@ -73,6 +74,16 @@ public function login(LoginRequest $request): JsonResponse
7374
], Response::HTTP_OK);
7475
}
7576

77+
public function logout(Request $request): JsonResponse
78+
{
79+
$request->user()->currentAccessToken()->delete();
80+
81+
return response()->json([
82+
'success' => true,
83+
'message' => 'Logout successful',
84+
]);
85+
}
86+
7687
public function show(User $user): UserResource
7788
{
7889
return new UserResource($this->userService->show($user));
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\CourseRegistration;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Http\Requests\CourseRegistration\StoreCourseRegistrationRequest;
7+
use App\Http\Resources\CourseRegistration\CourseRegistrationCollection;
8+
use App\Http\Resources\CourseRegistration\CourseRegistrationResource;
9+
use App\Http\Resources\CourseUserResource;
10+
use App\Models\CourseRegistration;
11+
use App\Services\CourseRegistrationService;
12+
use Illuminate\Http\Request;
13+
14+
class AdminCourseRegistrationController extends Controller
15+
{
16+
public function __construct(protected CourseRegistrationService $courseRegistrationService) {}
17+
18+
public function index(Request $request): CourseRegistrationCollection
19+
{
20+
return new CourseRegistrationCollection($this->courseRegistrationService->index($request)->paginate(self::PER_PAGE));
21+
}
22+
23+
public function store(StoreCourseRegistrationRequest $request): CourseUserResource
24+
{
25+
return new CourseUserResource($this->courseRegistrationService->store($request->getRegistration()));
26+
}
27+
28+
public function accept(CourseRegistration $courseRegistration): CourseRegistrationResource
29+
{
30+
return new CourseRegistrationResource($this->courseRegistrationService->accept($courseRegistration));
31+
}
32+
33+
public function decline(CourseRegistration $courseRegistration): CourseRegistrationResource
34+
{
35+
return new CourseRegistrationResource($this->courseRegistrationService->decline($courseRegistration));
36+
}
37+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\CourseRegistration;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Http\Requests\CourseRegistration\GuestCourseRegistrationRequest;
7+
use App\Http\Resources\CourseRegistration\CourseRegistrationResource;
8+
use App\Models\Course;
9+
use App\Services\GuestCourseRegistrationService;
10+
11+
class GuestCourseRegistrationController extends Controller
12+
{
13+
public function __construct(protected GuestCourseRegistrationService $guestCourseRegistrationService) {}
14+
15+
public function store(GuestCourseRegistrationRequest $request, Course $course): CourseRegistrationResource
16+
{
17+
return new CourseRegistrationResource($this->guestCourseRegistrationService->store($request->getGuestCourseRegistration($course)));
18+
}
19+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
namespace App\Http\Requests\CourseRegistration;
4+
5+
use App\Models\Course;
6+
use App\ValueObjects\StoreGuestCourseRegistration;
7+
use Illuminate\Foundation\Http\FormRequest;
8+
9+
class GuestCourseRegistrationRequest extends FormRequest
10+
{
11+
/**
12+
* Determine if the user is authorized to make this request.
13+
*/
14+
public function authorize(): bool
15+
{
16+
return true;
17+
}
18+
19+
/**
20+
* Get the validation rules that apply to the request.
21+
*
22+
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
23+
*/
24+
public function rules(): array
25+
{
26+
return [
27+
'name' => 'required|string|min:2|max:30|regex:/^[a-zA-ZÀ-ž\s\'-]+$/',
28+
'last_name' => 'required|string|min:2|max:30|regex:/^[a-zA-ZÀ-ž\s\'-]+$/',
29+
'email' => 'required|email|unique:users,email',
30+
'phone' => 'phone:PL,INTERNATIONAL',
31+
'phone_country' => 'required_with:phone_number|string|size:2',
32+
];
33+
}
34+
35+
public function getGuestCourseRegistration(Course $course): StoreGuestCourseRegistration
36+
{
37+
return new StoreGuestCourseRegistration(
38+
$course->id,
39+
$this->get('name'),
40+
$this->get('last_name'),
41+
$this->get('email'),
42+
$this->get('phone'),
43+
$this->get('phone_country')
44+
);
45+
}
46+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
namespace App\Http\Requests\CourseRegistration;
4+
5+
use App\ValueObjects\CreateCourseRegistration;
6+
use Illuminate\Foundation\Http\FormRequest;
7+
8+
class StoreCourseRegistrationRequest extends FormRequest
9+
{
10+
/**
11+
* Determine if the user is authorized to make this request.
12+
*/
13+
public function authorize(): bool
14+
{
15+
return true;
16+
}
17+
18+
/**
19+
* Get the validation rules that apply to the request.
20+
*
21+
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
22+
*/
23+
public function rules(): array
24+
{
25+
return [
26+
'user_id' => 'required|exists:users,id',
27+
'course_id' => 'required|exists:courses,id',
28+
];
29+
}
30+
31+
public function getRegistration(): CreateCourseRegistration
32+
{
33+
return new CreateCourseRegistration(
34+
$this->get('user_id'),
35+
$this->get('course_id')
36+
);
37+
}
38+
}

app/Http/Requests/UpdateUserRequest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ public function rules(): array
2525
'name' => 'string|min:2|max:30|regex:/^[a-zA-ZÀ-ž\s\'-]+$/',
2626
'last_name' => 'string|min:2|max:30|regex:/^[a-zA-ZÀ-ž\s\'-]+$/',
2727
'email' => 'email|max:255|unique:users,email,'.$this->user->id,
28-
'phone_number' => 'string|regex:/^\+?\d{9,15}$/',
28+
'phone_number' => 'phone:PL,INTERNATIONAL',
29+
'phone_country' => 'required_with:phone_number|string|size:2',
2930
'voivodship' => 'string|min:1|max:30',
3031
'city' => 'string|min:1|max:30',
3132
'zip_code' => 'string|regex:/^\d{2}-\d{3}$/',
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace App\Http\Resources\CourseRegistration;
4+
5+
use Illuminate\Http\Request;
6+
use Illuminate\Http\Resources\Json\ResourceCollection;
7+
8+
class CourseRegistrationCollection extends ResourceCollection
9+
{
10+
/**
11+
* Transform the resource collection into an array.
12+
*
13+
* @return array<int|string, mixed>
14+
*/
15+
public function toArray(Request $request): array
16+
{
17+
return parent::toArray($request);
18+
}
19+
}

0 commit comments

Comments
 (0)