Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions app/Dto/Parameters/AvailableCarParameters.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace App\Dto\Parameters;

use App\Http\Requests\AvailableCarRequest;
use Illuminate\Support\Carbon;

class AvailableCarParameters
{
public function __construct(
public Carbon $startedAt,
public Carbon $finishedAt,
public ?int $modelId,
public ?int $jobTitleId,
) {
}

public static function fromRequest(AvailableCarRequest $request): self
{
$data = $request->validated();

return new static(
startedAt: Carbon::parse($data['started_at']),
finishedAt: Carbon::parse($data['finished_at']),
modelId: $data['car_model_id'] ?? null,
jobTitleId: $data['job_title_id'] ?? null,
);
}
}
16 changes: 16 additions & 0 deletions app/Dto/Results/AvailableCarDto.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

namespace App\Dto\Results;

class AvailableCarDto
{
public function __construct(
public int $id,
public string $number,
public int $modelId,
public string $model,
public int $categoryId,
public string $category,
) {
}
}
23 changes: 23 additions & 0 deletions app/Http/Controllers/CarController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

namespace App\Http\Controllers;

use App\Dto\Parameters\AvailableCarParameters;
use App\Http\Requests\AvailableCarRequest;
use App\Http\Resources\AvailableCarResource;
use App\Services\CarService;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;

class CarController extends Controller
{
public function available(AvailableCarRequest $request): AnonymousResourceCollection
{
$carService = app(CarService::class);

$parameters = AvailableCarParameters::fromRequest($request);

$cars = $carService->availableCars($parameters);

return AvailableCarResource::collection($cars);
}
}
35 changes: 35 additions & 0 deletions app/Http/Requests/AvailableCarRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

namespace App\Http\Requests;

use App\Models\CarModel;
use App\Models\JobTitle;
use Illuminate\Foundation\Http\FormRequest;

class AvailableCarRequest extends FormRequest
{
public function rules(): array
{
return [
'started_at' => [
'required',
'date_format:Y-m-d H:i:s',
],
'finished_at' => [
'required',
'date_format:Y-m-d H:i:s',
'after_or_equal:started_at',
],
'car_model_id' => [
'sometimes',
'string',
'exists:' . CarModel::class . ',id',
],
'job_title_id' => [
'sometimes',
'int',
'exists:' . JobTitle::class . ',id',
],
];
}
}
30 changes: 30 additions & 0 deletions app/Http/Resources/AvailableCarResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace App\Http\Resources;

use App\Dto\Results\AvailableCarDto;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class AvailableCarResource extends JsonResource
{
public function __construct(AvailableCarDto $dto)
{
parent::__construct($dto);
}

public function toArray(Request $request): array
{
/** @var AvailableCarDto $dto */
$dto = $this->resource;

return [
'id' => $dto->id,
'number' => $dto->number,
'model_id' => $dto->modelId,
'model' => $dto->model,
'category_id' => $dto->categoryId,
'category' => $dto->category,
];
}
}
56 changes: 56 additions & 0 deletions app/Models/Car.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?php

namespace App\Models;

use Barryvdh\LaravelIdeHelper\Eloquent;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Carbon;

/**
* @property int $id
* @property int $car_model_id
* @property string $number
* @property int $car_category_id
* @property Carbon|null $created_at
* @property Carbon|null $updated_at
* @property-read CarCategory|null $carCategory
* @property-read CarModel|null $carModel
* @property-read Driver|null $driver
* @property-read Trip|null $trips
* @method static Builder<static>|Car newModelQuery()
* @method static Builder<static>|Car newQuery()
* @method static Builder<static>|Car query()
* @method static Builder<static>|Car whereCarModelId($value)
* @method static Builder<static>|Car whereCarCategoryId($value)
* @method static Builder<static>|Car whereCreatedAt($value)
* @method static Builder<static>|Car whereId($value)
* @method static Builder<static>|Car whereModel($value)
* @method static Builder<static>|Car whereNumber($value)
* @method static Builder<static>|Car whereUpdatedAt($value)
* @mixin Eloquent
*/
class Car extends Model
{
public function carModel(): BelongsTo
{
return $this->belongsTo(CarModel::class);
}

public function carCategory(): BelongsTo
{
return $this->belongsTo(CarCategory::class);
}

public function driver(): BelongsTo
{
return $this->belongsTo(Driver::class);
}

public function trips(): HasMany
{
return $this->hasMany(Trip::class);
}
}
41 changes: 41 additions & 0 deletions app/Models/CarCategory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

namespace App\Models;

use Barryvdh\LaravelIdeHelper\Eloquent;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Collection;

/**
* @property int $id
* @property string $title
* @property Carbon|null $created_at
* @property Carbon|null $updated_at
* @property-read Collection<int, Car> $cars
* @property-read Collection<int, JobTitle> $jobTitles
* @property-read int|null $job_titles_count
* @method static Builder<static>|CarCategory newModelQuery()
* @method static Builder<static>|CarCategory newQuery()
* @method static Builder<static>|CarCategory query()
* @method static Builder<static>|CarCategory whereCreatedAt($value)
* @method static Builder<static>|CarCategory whereId($value)
* @method static Builder<static>|CarCategory whereTitle($value)
* @method static Builder<static>|CarCategory whereUpdatedAt($value)
* @mixin Eloquent
*/
class CarCategory extends Model
{
public function cars(): HasMany
{
return $this->hasMany(Car::class);
}

public function jobTitles(): BelongsToMany
{
return $this->belongsToMany(JobTitle::class);
}
}
33 changes: 33 additions & 0 deletions app/Models/CarModel.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

namespace App\Models;

use Barryvdh\LaravelIdeHelper\Eloquent;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Carbon;

/**
* @property int $id
* @property string $title
* @property Carbon|null $created_at
* @property Carbon|null $updated_at
* @property-read Collection<int, Car> $cars
* @method static Builder<static>|CarModel newModelQuery()
* @method static Builder<static>|CarModel newQuery()
* @method static Builder<static>|CarModel query()
* @method static Builder<static>|CarModel whereCreatedAt($value)
* @method static Builder<static>|CarModel whereId($value)
* @method static Builder<static>|CarModel whereTitle($value)
* @method static Builder<static>|CarModel whereUpdatedAt($value)
* @mixin Eloquent
*/
class CarModel extends Model
{
public function cars(): HasMany
{
return $this->hasMany(Car::class);
}
}
34 changes: 34 additions & 0 deletions app/Models/Driver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

namespace App\Models;

use Barryvdh\LaravelIdeHelper\Eloquent;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Support\Carbon;

/**
* @property int $id
* @property string $name
* @property int|null $car_id
* @property Carbon|null $created_at
* @property Carbon|null $updated_at
* @property-read Car|null $car
* @method static Builder<static>|Driver newModelQuery()
* @method static Builder<static>|Driver newQuery()
* @method static Builder<static>|Driver query()
* @method static Builder<static>|Driver whereCarId($value)
* @method static Builder<static>|Driver whereCreatedAt($value)
* @method static Builder<static>|Driver whereId($value)
* @method static Builder<static>|Driver whereName($value)
* @method static Builder<static>|Driver whereUpdatedAt($value)
* @mixin Eloquent
*/
class Driver extends Model
{
public function car(): HasOne
{
return $this->hasOne(Car::class);
}
}
42 changes: 42 additions & 0 deletions app/Models/Employee.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

namespace App\Models;

use Barryvdh\LaravelIdeHelper\Eloquent;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Support\Carbon;

/**
* @property int $id
* @property string $name
* @property int $job_title_id
* @property Carbon|null $created_at
* @property Carbon|null $updated_at
* @property-read JobTitle|null $jobTitle
* @property-read Collection<int, Trip> $trips
* @method static Builder<static>|Employee newModelQuery()
* @method static Builder<static>|Employee newQuery()
* @method static Builder<static>|Employee query()
* @method static Builder<static>|Employee whereCreatedAt($value)
* @method static Builder<static>|Employee whereId($value)
* @method static Builder<static>|Employee whereJobTitleId($value)
* @method static Builder<static>|Employee whereName($value)
* @method static Builder<static>|Employee whereUpdatedAt($value)
* @mixin Eloquent
*/
class Employee extends Model
{
public function jobTitle(): HasOne
{
return $this->hasOne(JobTitle::class);
}

public function trips(): HasMany
{
return $this->hasMany(Trip::class);
}
}
41 changes: 41 additions & 0 deletions app/Models/JobTitle.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

namespace App\Models;

use Barryvdh\LaravelIdeHelper\Eloquent;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Collection;

/**
* @property int $id
* @property string $title
* @property Carbon|null $created_at
* @property Carbon|null $updated_at
* @property-read Collection<int, CarCategory> $carCategories
* @property-read int|null $car_categories_count
* @property-read Collection<int, Employee> $employees
* @method static Builder<static>|JobTitle newModelQuery()
* @method static Builder<static>|JobTitle newQuery()
* @method static Builder<static>|JobTitle query()
* @method static Builder<static>|JobTitle whereCreatedAt($value)
* @method static Builder<static>|JobTitle whereId($value)
* @method static Builder<static>|JobTitle whereTitle($value)
* @method static Builder<static>|JobTitle whereUpdatedAt($value)
* @mixin Eloquent
*/
class JobTitle extends Model
{
public function carCategories(): BelongsToMany
{
return $this->belongsToMany(CarCategory::class);
}

public function employees(): HasMany
{
return $this->hasMany(Employee::class);
}
}
Loading