Skip to content

Commit 9602663

Browse files
authored
Merge pull request #7 from d-alejandro/feature/develop
Feature/develop
2 parents 1bc683c + 81c0274 commit 9602663

26 files changed

+695
-30
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ cp .env.example .env
5151
- `docker-compose exec php-fpm composer install`
5252
- `docker-compose exec php-fpm php artisan key:generate`
5353
- `docker-compose exec php-fpm php artisan migrate`
54+
- `docker-compose exec php-fpm php artisan db:seed`
5455

5556
## Testing
5657

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
namespace App\DTO\Interfaces;
4+
5+
interface OrderUpdateRequestDTOInterface
6+
{
7+
}

app/DTO/OrderUpdateRequestDTO.php

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace App\DTO;
4+
5+
use App\DTO\Interfaces\OrderUpdateRequestDTOInterface;
6+
7+
readonly class OrderUpdateRequestDTO implements OrderUpdateRequestDTOInterface
8+
{
9+
public function __construct(
10+
public int $guestCount,
11+
public int $transportCount,
12+
public string $userName,
13+
public string $email,
14+
public string $phone,
15+
public string|null $note = null,
16+
public string|null $adminNote = null
17+
) {
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Api;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Http\Requests\Interfaces\OrderUpdateRequestInterface;
7+
use App\Presenters\Interfaces\OrderPresenterInterface;
8+
use App\UseCases\Interfaces\OrderUpdateUseCaseInterface;
9+
10+
final class OrderUpdateController extends Controller
11+
{
12+
public function __construct(
13+
private OrderUpdateUseCaseInterface $useCase,
14+
private OrderPresenterInterface $presenter
15+
) {
16+
}
17+
18+
public function __invoke(OrderUpdateRequestInterface $request, int $id): mixed
19+
{
20+
$requestDTO = $request->getValidated();
21+
22+
$response = $this->useCase->execute($requestDTO, $id);
23+
24+
return $this->presenter->present($response);
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace App\Http\Requests\Enums;
4+
5+
use App\Http\Requests\Enums\Interfaces\RequestParamEnumInterface;
6+
7+
enum OrderUpdateRequestParamEnum: string implements RequestParamEnumInterface
8+
{
9+
case GuestCount = 'guest_count';
10+
case TransportCount = 'transport_count';
11+
case UserName = 'user_name';
12+
case Email = 'email';
13+
case Phone = 'phone';
14+
case Note = 'note';
15+
case AdminNote = 'admin_note';
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace App\Http\Requests\Interfaces;
4+
5+
use App\DTO\Interfaces\OrderUpdateRequestDTOInterface;
6+
7+
interface OrderUpdateRequestInterface
8+
{
9+
public function rules(): array;
10+
11+
public function getValidated(): OrderUpdateRequestDTOInterface;
12+
}
+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
namespace App\Http\Requests;
4+
5+
use App\DTO\OrderUpdateRequestDTO;
6+
use App\Helpers\Interfaces\RequestFilterHelperInterface;
7+
use App\Http\Requests\Enums\OrderUpdateRequestParamEnum;
8+
use App\Http\Requests\Interfaces\OrderUpdateRequestInterface;
9+
use App\Providers\Bindings\HelperServiceProvider;
10+
use Illuminate\Foundation\Http\FormRequest;
11+
12+
class OrderUpdateRequest extends FormRequest implements OrderUpdateRequestInterface
13+
{
14+
public function rules(): array
15+
{
16+
return [
17+
OrderUpdateRequestParamEnum::GuestCount->value => 'required|integer|min:1',
18+
OrderUpdateRequestParamEnum::TransportCount->value => 'required|integer|min:1',
19+
OrderUpdateRequestParamEnum::UserName->value => 'required|string|max:100',
20+
OrderUpdateRequestParamEnum::Email->value => 'required|string|email|max:100',
21+
OrderUpdateRequestParamEnum::Phone->value => 'required|string|max:50',
22+
OrderUpdateRequestParamEnum::Note->value => 'nullable|string',
23+
OrderUpdateRequestParamEnum::AdminNote->value => 'nullable|string',
24+
];
25+
}
26+
27+
public function getValidated(): OrderUpdateRequestDTO
28+
{
29+
$requestParams = $this->validated();
30+
31+
/* @var $filter \App\Helpers\RequestFilterHelper */
32+
$filter = resolve(RequestFilterHelperInterface::class, [
33+
HelperServiceProvider::PARAM_REQUEST_PARAMS => $requestParams,
34+
]);
35+
36+
return new OrderUpdateRequestDTO(
37+
$requestParams[OrderUpdateRequestParamEnum::GuestCount->value],
38+
$requestParams[OrderUpdateRequestParamEnum::TransportCount->value],
39+
$requestParams[OrderUpdateRequestParamEnum::UserName->value],
40+
$requestParams[OrderUpdateRequestParamEnum::Email->value],
41+
$requestParams[OrderUpdateRequestParamEnum::Phone->value],
42+
$filter->checkRequestParam(OrderUpdateRequestParamEnum::Note),
43+
$filter->checkRequestParam(OrderUpdateRequestParamEnum::AdminNote)
44+
);
45+
}
46+
}

app/Providers/Bindings/RepositoryServiceProvider.php

+4
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@
1111
use App\Repositories\Interfaces\OrderIndexRepositoryInterface;
1212
use App\Repositories\Interfaces\OrderShowRepositoryInterface;
1313
use App\Repositories\Interfaces\OrderStoreRepositoryInterface;
14+
use App\Repositories\Interfaces\OrderUpdateRepositoryInterface;
1415
use App\Repositories\OrderDestroyRepository;
1516
use App\Repositories\OrderIndexRepository;
1617
use App\Repositories\OrderShowRepository;
1718
use App\Repositories\OrderStoreRepository;
1819
use App\Repositories\OrderStoreRepositoryDecorator;
20+
use App\Repositories\OrderUpdateRepository;
1921
use App\UseCases\OrderStoreUseCase;
2022
use Illuminate\Support\ServiceProvider;
2123

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

4850
$this->app->bind(OrderDestroyRepositoryInterface::class, OrderDestroyRepository::class);
51+
52+
$this->app->bind(OrderUpdateRepositoryInterface::class, OrderUpdateRepository::class);
4953
}
5054
}

app/Providers/Bindings/RequestServiceProvider.php

+3
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
namespace App\Providers\Bindings;
44

55
use App\Http\Requests\Interfaces\OrderStoreRequestInterface;
6+
use App\Http\Requests\Interfaces\OrderUpdateRequestInterface;
67
use App\Http\Requests\OrderIndexRequest;
78
use App\Http\Requests\Interfaces\OrderIndexRequestInterface;
89
use App\Http\Requests\OrderStoreRequest;
10+
use App\Http\Requests\OrderUpdateRequest;
911
use Illuminate\Support\ServiceProvider;
1012

1113
class RequestServiceProvider extends ServiceProvider
@@ -14,5 +16,6 @@ public function register(): void
1416
{
1517
$this->app->bind(OrderIndexRequestInterface::class, OrderIndexRequest::class);
1618
$this->app->bind(OrderStoreRequestInterface::class, OrderStoreRequest::class);
19+
$this->app->bind(OrderUpdateRequestInterface::class, OrderUpdateRequest::class);
1720
}
1821
}

app/Providers/Bindings/UseCaseServiceProvider.php

+3
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
use App\UseCases\Interfaces\OrderDestroyUseCaseInterface;
66
use App\UseCases\Interfaces\OrderShowUseCaseInterface;
77
use App\UseCases\Interfaces\OrderStoreUseCaseInterface;
8+
use App\UseCases\Interfaces\OrderUpdateUseCaseInterface;
89
use App\UseCases\OrderDestroyUseCase;
910
use App\UseCases\OrderIndexUseCase;
1011
use App\UseCases\Interfaces\OrderIndexUseCaseInterface;
1112
use App\UseCases\OrderShowUseCase;
1213
use App\UseCases\OrderStoreUseCase;
14+
use App\UseCases\OrderUpdateUseCase;
1315
use Illuminate\Support\ServiceProvider;
1416

1517
class UseCaseServiceProvider extends ServiceProvider
@@ -20,5 +22,6 @@ public function register(): void
2022
$this->app->bind(OrderStoreUseCaseInterface::class, OrderStoreUseCase::class);
2123
$this->app->bind(OrderShowUseCaseInterface::class, OrderShowUseCase::class);
2224
$this->app->bind(OrderDestroyUseCaseInterface::class, OrderDestroyUseCase::class);
25+
$this->app->bind(OrderUpdateUseCaseInterface::class, OrderUpdateUseCase::class);
2326
}
2427
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace App\Repositories\Interfaces;
4+
5+
use App\DTO\Interfaces\OrderResponseDTOInterface;
6+
use App\DTO\Interfaces\OrderUpdateRequestDTOInterface;
7+
8+
interface OrderUpdateRepositoryInterface
9+
{
10+
public function make(OrderResponseDTOInterface $responseDTO, OrderUpdateRequestDTOInterface $requestDTO): void;
11+
}
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace App\Repositories;
4+
5+
use App\DTO\Interfaces\OrderResponseDTOInterface;
6+
use App\DTO\Interfaces\OrderUpdateRequestDTOInterface;
7+
use App\Models\Enums\OrderColumn;
8+
use App\Repositories\Interfaces\OrderUpdateRepositoryInterface;
9+
10+
class OrderUpdateRepository implements OrderUpdateRepositoryInterface
11+
{
12+
public function make(OrderResponseDTOInterface $responseDTO, OrderUpdateRequestDTOInterface $requestDTO): void
13+
{
14+
$order = $responseDTO->order;
15+
16+
$order->setColumn(OrderColumn::GuestCount, $requestDTO->guestCount);
17+
$order->setColumn(OrderColumn::TransportCount, $requestDTO->transportCount);
18+
$order->setColumn(OrderColumn::UserName, $requestDTO->userName);
19+
$order->setColumn(OrderColumn::Email, $requestDTO->email);
20+
$order->setColumn(OrderColumn::Phone, $requestDTO->phone);
21+
$order->setColumn(OrderColumn::Note, $requestDTO->note);
22+
$order->setColumn(OrderColumn::AdminNote, $requestDTO->adminNote);
23+
24+
$order->save();
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace App\UseCases\Exceptions;
4+
5+
use App\Exceptions\BaseException;
6+
7+
class OrderUpdateException extends BaseException
8+
{
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace App\UseCases\Interfaces;
4+
5+
use App\DTO\Interfaces\OrderResponseDTOInterface;
6+
use App\DTO\Interfaces\OrderUpdateRequestDTOInterface;
7+
8+
interface OrderUpdateUseCaseInterface
9+
{
10+
public function execute(OrderUpdateRequestDTOInterface $requestDTO, int $id): OrderResponseDTOInterface;
11+
}

app/UseCases/OrderUpdateUseCase.php

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace App\UseCases;
4+
5+
use App\DTO\Interfaces\OrderResponseDTOInterface;
6+
use App\DTO\Interfaces\OrderUpdateRequestDTOInterface;
7+
use App\Repositories\Interfaces\OrderUpdateRepositoryInterface;
8+
use App\UseCases\Exceptions\OrderUpdateException;
9+
use App\UseCases\Interfaces\OrderShowUseCaseInterface;
10+
use App\UseCases\Interfaces\OrderUpdateUseCaseInterface;
11+
use Throwable;
12+
13+
class OrderUpdateUseCase implements OrderUpdateUseCaseInterface
14+
{
15+
public function __construct(
16+
private OrderShowUseCaseInterface $showUseCase,
17+
private OrderUpdateRepositoryInterface $repository
18+
) {
19+
}
20+
21+
/**
22+
* @throws OrderUpdateException
23+
*/
24+
public function execute(OrderUpdateRequestDTOInterface $requestDTO, int $id): OrderResponseDTOInterface
25+
{
26+
try {
27+
$responseDTO = $this->showUseCase->execute($id);
28+
29+
$this->repository->make($responseDTO, $requestDTO);
30+
31+
return $responseDTO;
32+
} catch (Throwable $exception) {
33+
throw new OrderUpdateException('Order update error.', previous: $exception);
34+
}
35+
}
36+
}

routes/api.php

+2
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
use App\Http\Controllers\Api\OrderIndexController;
55
use App\Http\Controllers\Api\OrderShowController;
66
use App\Http\Controllers\Api\OrderStoreController;
7+
use App\Http\Controllers\Api\OrderUpdateController;
78
use Illuminate\Support\Facades\Route;
89

910
Route::get('/orders', OrderIndexController::class)->name('order.index');
1011
Route::post('/orders', OrderStoreController::class)->name('order.store');
1112
Route::get('/orders/{id}', OrderShowController::class)->name('order.show');
1213
Route::delete('/orders/{id}', OrderDestroyController::class)->name('order.destroy');
14+
Route::put('/orders/{id}', OrderUpdateController::class)->name('order.update');

tests/Feature/OrderStoreControllerTest.php

+16-8
Original file line numberDiff line numberDiff line change
@@ -49,19 +49,27 @@ protected function tearDown(): void
4949

5050
public function getDataProvider(): array
5151
{
52+
$agencyName = 'AgencyNameTest';
5253
$rentalDate = now()->addWeek();
54+
$guestCount = 1;
55+
$transportCount = 1;
56+
$userName = 'UserNameTest';
57+
$email = 'test@test.test';
58+
$phone = '7000000000';
59+
$note = 'NoteTest';
60+
$adminNote = 'AdminNoteTest';
5361
return [
5462
'single' => [
5563
'request' => [
56-
OrderStoreRequestParamEnum::AgencyName->value => $agencyName = 'AgencyNameTest',
64+
OrderStoreRequestParamEnum::AgencyName->value => $agencyName,
5765
OrderStoreRequestParamEnum::RentalDate->value => $rentalDate,
58-
OrderStoreRequestParamEnum::GuestCount->value => $guestCount = 1,
59-
OrderStoreRequestParamEnum::TransportCount->value => $transportCount = 1,
60-
OrderStoreRequestParamEnum::UserName->value => $userName = 'UserNameTest',
61-
OrderStoreRequestParamEnum::Email->value => $email = 'test@test.test',
62-
OrderStoreRequestParamEnum::Phone->value => $phone = '7000000000',
63-
OrderStoreRequestParamEnum::Note->value => $note = 'NoteTest',
64-
OrderStoreRequestParamEnum::AdminNote->value => $adminNote = 'AdminNoteTest',
66+
OrderStoreRequestParamEnum::GuestCount->value => $guestCount,
67+
OrderStoreRequestParamEnum::TransportCount->value => $transportCount,
68+
OrderStoreRequestParamEnum::UserName->value => $userName,
69+
OrderStoreRequestParamEnum::Email->value => $email,
70+
OrderStoreRequestParamEnum::Phone->value => $phone,
71+
OrderStoreRequestParamEnum::Note->value => $note,
72+
OrderStoreRequestParamEnum::AdminNote->value => $adminNote,
6573
],
6674
'expectedResponse' => fn(Order $order) => [
6775
OrderResourceEnum::Id->value => $order->getKey(),

0 commit comments

Comments
 (0)