Skip to content

Feature/develop #7

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Merged
merged 12 commits into from
Feb 10, 2023
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ cp .env.example .env
- `docker-compose exec php-fpm composer install`
- `docker-compose exec php-fpm php artisan key:generate`
- `docker-compose exec php-fpm php artisan migrate`
- `docker-compose exec php-fpm php artisan db:seed`

## Testing

Expand Down
7 changes: 7 additions & 0 deletions app/DTO/Interfaces/OrderUpdateRequestDTOInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?php

namespace App\DTO\Interfaces;

interface OrderUpdateRequestDTOInterface
{
}
19 changes: 19 additions & 0 deletions app/DTO/OrderUpdateRequestDTO.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace App\DTO;

use App\DTO\Interfaces\OrderUpdateRequestDTOInterface;

readonly class OrderUpdateRequestDTO implements OrderUpdateRequestDTOInterface
{
public function __construct(
public int $guestCount,
public int $transportCount,
public string $userName,
public string $email,
public string $phone,
public string|null $note = null,
public string|null $adminNote = null
) {
}
}
26 changes: 26 additions & 0 deletions app/Http/Controllers/Api/OrderUpdateController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Requests\Interfaces\OrderUpdateRequestInterface;
use App\Presenters\Interfaces\OrderPresenterInterface;
use App\UseCases\Interfaces\OrderUpdateUseCaseInterface;

final class OrderUpdateController extends Controller
{
public function __construct(
private OrderUpdateUseCaseInterface $useCase,
private OrderPresenterInterface $presenter
) {
}

public function __invoke(OrderUpdateRequestInterface $request, int $id): mixed
{
$requestDTO = $request->getValidated();

$response = $this->useCase->execute($requestDTO, $id);

return $this->presenter->present($response);
}
}
16 changes: 16 additions & 0 deletions app/Http/Requests/Enums/OrderUpdateRequestParamEnum.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

namespace App\Http\Requests\Enums;

use App\Http\Requests\Enums\Interfaces\RequestParamEnumInterface;

enum OrderUpdateRequestParamEnum: string implements RequestParamEnumInterface
{
case GuestCount = 'guest_count';
case TransportCount = 'transport_count';
case UserName = 'user_name';
case Email = 'email';
case Phone = 'phone';
case Note = 'note';
case AdminNote = 'admin_note';
}
12 changes: 12 additions & 0 deletions app/Http/Requests/Interfaces/OrderUpdateRequestInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

namespace App\Http\Requests\Interfaces;

use App\DTO\Interfaces\OrderUpdateRequestDTOInterface;

interface OrderUpdateRequestInterface
{
public function rules(): array;

public function getValidated(): OrderUpdateRequestDTOInterface;
}
46 changes: 46 additions & 0 deletions app/Http/Requests/OrderUpdateRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

namespace App\Http\Requests;

use App\DTO\OrderUpdateRequestDTO;
use App\Helpers\Interfaces\RequestFilterHelperInterface;
use App\Http\Requests\Enums\OrderUpdateRequestParamEnum;
use App\Http\Requests\Interfaces\OrderUpdateRequestInterface;
use App\Providers\Bindings\HelperServiceProvider;
use Illuminate\Foundation\Http\FormRequest;

class OrderUpdateRequest extends FormRequest implements OrderUpdateRequestInterface
{
public function rules(): array
{
return [
OrderUpdateRequestParamEnum::GuestCount->value => 'required|integer|min:1',
OrderUpdateRequestParamEnum::TransportCount->value => 'required|integer|min:1',
OrderUpdateRequestParamEnum::UserName->value => 'required|string|max:100',
OrderUpdateRequestParamEnum::Email->value => 'required|string|email|max:100',
OrderUpdateRequestParamEnum::Phone->value => 'required|string|max:50',
OrderUpdateRequestParamEnum::Note->value => 'nullable|string',
OrderUpdateRequestParamEnum::AdminNote->value => 'nullable|string',
];
}

public function getValidated(): OrderUpdateRequestDTO
{
$requestParams = $this->validated();

/* @var $filter \App\Helpers\RequestFilterHelper */
$filter = resolve(RequestFilterHelperInterface::class, [
HelperServiceProvider::PARAM_REQUEST_PARAMS => $requestParams,
]);

return new OrderUpdateRequestDTO(
$requestParams[OrderUpdateRequestParamEnum::GuestCount->value],
$requestParams[OrderUpdateRequestParamEnum::TransportCount->value],
$requestParams[OrderUpdateRequestParamEnum::UserName->value],
$requestParams[OrderUpdateRequestParamEnum::Email->value],
$requestParams[OrderUpdateRequestParamEnum::Phone->value],
$filter->checkRequestParam(OrderUpdateRequestParamEnum::Note),
$filter->checkRequestParam(OrderUpdateRequestParamEnum::AdminNote)
);
}
}
4 changes: 4 additions & 0 deletions app/Providers/Bindings/RepositoryServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@
use App\Repositories\Interfaces\OrderIndexRepositoryInterface;
use App\Repositories\Interfaces\OrderShowRepositoryInterface;
use App\Repositories\Interfaces\OrderStoreRepositoryInterface;
use App\Repositories\Interfaces\OrderUpdateRepositoryInterface;
use App\Repositories\OrderDestroyRepository;
use App\Repositories\OrderIndexRepository;
use App\Repositories\OrderShowRepository;
use App\Repositories\OrderStoreRepository;
use App\Repositories\OrderStoreRepositoryDecorator;
use App\Repositories\OrderUpdateRepository;
use App\UseCases\OrderStoreUseCase;
use Illuminate\Support\ServiceProvider;

Expand Down Expand Up @@ -46,5 +48,7 @@ public function register(): void
->give(fn() => new CriteriaApplier(Order::class));

$this->app->bind(OrderDestroyRepositoryInterface::class, OrderDestroyRepository::class);

$this->app->bind(OrderUpdateRepositoryInterface::class, OrderUpdateRepository::class);
}
}
3 changes: 3 additions & 0 deletions app/Providers/Bindings/RequestServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
namespace App\Providers\Bindings;

use App\Http\Requests\Interfaces\OrderStoreRequestInterface;
use App\Http\Requests\Interfaces\OrderUpdateRequestInterface;
use App\Http\Requests\OrderIndexRequest;
use App\Http\Requests\Interfaces\OrderIndexRequestInterface;
use App\Http\Requests\OrderStoreRequest;
use App\Http\Requests\OrderUpdateRequest;
use Illuminate\Support\ServiceProvider;

class RequestServiceProvider extends ServiceProvider
Expand All @@ -14,5 +16,6 @@ public function register(): void
{
$this->app->bind(OrderIndexRequestInterface::class, OrderIndexRequest::class);
$this->app->bind(OrderStoreRequestInterface::class, OrderStoreRequest::class);
$this->app->bind(OrderUpdateRequestInterface::class, OrderUpdateRequest::class);
}
}
3 changes: 3 additions & 0 deletions app/Providers/Bindings/UseCaseServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@
use App\UseCases\Interfaces\OrderDestroyUseCaseInterface;
use App\UseCases\Interfaces\OrderShowUseCaseInterface;
use App\UseCases\Interfaces\OrderStoreUseCaseInterface;
use App\UseCases\Interfaces\OrderUpdateUseCaseInterface;
use App\UseCases\OrderDestroyUseCase;
use App\UseCases\OrderIndexUseCase;
use App\UseCases\Interfaces\OrderIndexUseCaseInterface;
use App\UseCases\OrderShowUseCase;
use App\UseCases\OrderStoreUseCase;
use App\UseCases\OrderUpdateUseCase;
use Illuminate\Support\ServiceProvider;

class UseCaseServiceProvider extends ServiceProvider
Expand All @@ -20,5 +22,6 @@ public function register(): void
$this->app->bind(OrderStoreUseCaseInterface::class, OrderStoreUseCase::class);
$this->app->bind(OrderShowUseCaseInterface::class, OrderShowUseCase::class);
$this->app->bind(OrderDestroyUseCaseInterface::class, OrderDestroyUseCase::class);
$this->app->bind(OrderUpdateUseCaseInterface::class, OrderUpdateUseCase::class);
}
}
11 changes: 11 additions & 0 deletions app/Repositories/Interfaces/OrderUpdateRepositoryInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace App\Repositories\Interfaces;

use App\DTO\Interfaces\OrderResponseDTOInterface;
use App\DTO\Interfaces\OrderUpdateRequestDTOInterface;

interface OrderUpdateRepositoryInterface
{
public function make(OrderResponseDTOInterface $responseDTO, OrderUpdateRequestDTOInterface $requestDTO): void;
}
26 changes: 26 additions & 0 deletions app/Repositories/OrderUpdateRepository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

namespace App\Repositories;

use App\DTO\Interfaces\OrderResponseDTOInterface;
use App\DTO\Interfaces\OrderUpdateRequestDTOInterface;
use App\Models\Enums\OrderColumn;
use App\Repositories\Interfaces\OrderUpdateRepositoryInterface;

class OrderUpdateRepository implements OrderUpdateRepositoryInterface
{
public function make(OrderResponseDTOInterface $responseDTO, OrderUpdateRequestDTOInterface $requestDTO): void
{
$order = $responseDTO->order;

$order->setColumn(OrderColumn::GuestCount, $requestDTO->guestCount);
$order->setColumn(OrderColumn::TransportCount, $requestDTO->transportCount);
$order->setColumn(OrderColumn::UserName, $requestDTO->userName);
$order->setColumn(OrderColumn::Email, $requestDTO->email);
$order->setColumn(OrderColumn::Phone, $requestDTO->phone);
$order->setColumn(OrderColumn::Note, $requestDTO->note);
$order->setColumn(OrderColumn::AdminNote, $requestDTO->adminNote);

$order->save();
}
}
9 changes: 9 additions & 0 deletions app/UseCases/Exceptions/OrderUpdateException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php

namespace App\UseCases\Exceptions;

use App\Exceptions\BaseException;

class OrderUpdateException extends BaseException
{
}
11 changes: 11 additions & 0 deletions app/UseCases/Interfaces/OrderUpdateUseCaseInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace App\UseCases\Interfaces;

use App\DTO\Interfaces\OrderResponseDTOInterface;
use App\DTO\Interfaces\OrderUpdateRequestDTOInterface;

interface OrderUpdateUseCaseInterface
{
public function execute(OrderUpdateRequestDTOInterface $requestDTO, int $id): OrderResponseDTOInterface;
}
36 changes: 36 additions & 0 deletions app/UseCases/OrderUpdateUseCase.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

namespace App\UseCases;

use App\DTO\Interfaces\OrderResponseDTOInterface;
use App\DTO\Interfaces\OrderUpdateRequestDTOInterface;
use App\Repositories\Interfaces\OrderUpdateRepositoryInterface;
use App\UseCases\Exceptions\OrderUpdateException;
use App\UseCases\Interfaces\OrderShowUseCaseInterface;
use App\UseCases\Interfaces\OrderUpdateUseCaseInterface;
use Throwable;

class OrderUpdateUseCase implements OrderUpdateUseCaseInterface
{
public function __construct(
private OrderShowUseCaseInterface $showUseCase,
private OrderUpdateRepositoryInterface $repository
) {
}

/**
* @throws OrderUpdateException
*/
public function execute(OrderUpdateRequestDTOInterface $requestDTO, int $id): OrderResponseDTOInterface
{
try {
$responseDTO = $this->showUseCase->execute($id);

$this->repository->make($responseDTO, $requestDTO);

return $responseDTO;
} catch (Throwable $exception) {
throw new OrderUpdateException('Order update error.', previous: $exception);
}
}
}
2 changes: 2 additions & 0 deletions routes/api.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
use App\Http\Controllers\Api\OrderIndexController;
use App\Http\Controllers\Api\OrderShowController;
use App\Http\Controllers\Api\OrderStoreController;
use App\Http\Controllers\Api\OrderUpdateController;
use Illuminate\Support\Facades\Route;

Route::get('/orders', OrderIndexController::class)->name('order.index');
Route::post('/orders', OrderStoreController::class)->name('order.store');
Route::get('/orders/{id}', OrderShowController::class)->name('order.show');
Route::delete('/orders/{id}', OrderDestroyController::class)->name('order.destroy');
Route::put('/orders/{id}', OrderUpdateController::class)->name('order.update');
24 changes: 16 additions & 8 deletions tests/Feature/OrderStoreControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,19 +49,27 @@ protected function tearDown(): void

public function getDataProvider(): array
{
$agencyName = 'AgencyNameTest';
$rentalDate = now()->addWeek();
$guestCount = 1;
$transportCount = 1;
$userName = 'UserNameTest';
$email = 'test@test.test';
$phone = '7000000000';
$note = 'NoteTest';
$adminNote = 'AdminNoteTest';
return [
'single' => [
'request' => [
OrderStoreRequestParamEnum::AgencyName->value => $agencyName = 'AgencyNameTest',
OrderStoreRequestParamEnum::AgencyName->value => $agencyName,
OrderStoreRequestParamEnum::RentalDate->value => $rentalDate,
OrderStoreRequestParamEnum::GuestCount->value => $guestCount = 1,
OrderStoreRequestParamEnum::TransportCount->value => $transportCount = 1,
OrderStoreRequestParamEnum::UserName->value => $userName = 'UserNameTest',
OrderStoreRequestParamEnum::Email->value => $email = 'test@test.test',
OrderStoreRequestParamEnum::Phone->value => $phone = '7000000000',
OrderStoreRequestParamEnum::Note->value => $note = 'NoteTest',
OrderStoreRequestParamEnum::AdminNote->value => $adminNote = 'AdminNoteTest',
OrderStoreRequestParamEnum::GuestCount->value => $guestCount,
OrderStoreRequestParamEnum::TransportCount->value => $transportCount,
OrderStoreRequestParamEnum::UserName->value => $userName,
OrderStoreRequestParamEnum::Email->value => $email,
OrderStoreRequestParamEnum::Phone->value => $phone,
OrderStoreRequestParamEnum::Note->value => $note,
OrderStoreRequestParamEnum::AdminNote->value => $adminNote,
],
'expectedResponse' => fn(Order $order) => [
OrderResourceEnum::Id->value => $order->getKey(),
Expand Down
Loading