diff --git a/backend/app/Data/ProductDTO.php b/backend/app/Data/ProductDTO.php new file mode 100644 index 0000000..ea34b90 --- /dev/null +++ b/backend/app/Data/ProductDTO.php @@ -0,0 +1,53 @@ + + */ + public function toArray(): array + { + return [ + 'id' => $this->id, + 'title' => $this->title, + 'description' => $this->description, + 'actualPrice' => $this->actualPrice, + 'listPrice' => $this->listPrice, + 'category' => $this->category->toArray(), + 'productImage' => array_map(fn (ProductImageDTO $productImage) => $productImage->toArray(), + $this->productImages), + ]; + } + + public static function fromModel(Product $product): self + { + return new self( + id: $product->id, + title: $product->title, + description: $product->description, + actualPrice: $product->actual_price, + listPrice: $product->list_price, + category: ProductCategoryDTO::fromModel($product->category), + productImages: $product->images->map(fn (ProductImage $productImage) => ProductImageDTO::fromModel($productImage))->all(), + ); + } +} diff --git a/backend/app/Data/ProductImageDTO.php b/backend/app/Data/ProductImageDTO.php index ac40a4e..0736274 100644 --- a/backend/app/Data/ProductImageDTO.php +++ b/backend/app/Data/ProductImageDTO.php @@ -3,6 +3,7 @@ namespace App\Data; use App\Contracts\OutputDataTransferObject; +use App\Models\ProductImage; final readonly class ProductImageDTO implements OutputDataTransferObject { @@ -23,4 +24,13 @@ public function toArray(): array 'productId' => $this->productId, ]; } + + public static function fromModel(ProductImage $productImage): self + { + return new self( + $productImage->id, + $productImage->path, + $productImage->product_id + ); + } } diff --git a/backend/app/Http/Controllers/ProductController.php b/backend/app/Http/Controllers/ProductController.php index 0693776..9081473 100644 --- a/backend/app/Http/Controllers/ProductController.php +++ b/backend/app/Http/Controllers/ProductController.php @@ -2,13 +2,21 @@ namespace App\Http\Controllers; +use App\Data\ProductDTO; use App\Http\Requests\CreateProductRequest; +use App\Http\Resources\ProductResource; use App\Models\Product; use Illuminate\Http\Request; class ProductController extends Controller { - public function index() {} + public function index() + { + $paginator = Product::query()->with(['category:id,name,slug', 'images:id,path,product_id'])->paginate(); + $paginatedDtos = $paginator->through(fn ($product) => ProductDTO::fromModel($product)); + + return ProductResource::collection($paginatedDtos); + } public function store(CreateProductRequest $request) { diff --git a/backend/app/Http/Resources/ProductCollection.php b/backend/app/Http/Resources/ProductCollection.php new file mode 100644 index 0000000..ae72b40 --- /dev/null +++ b/backend/app/Http/Resources/ProductCollection.php @@ -0,0 +1,16 @@ + $this->collection, + ]; + } +} diff --git a/backend/app/Http/Resources/ProductResource.php b/backend/app/Http/Resources/ProductResource.php new file mode 100644 index 0000000..ea6b9f8 --- /dev/null +++ b/backend/app/Http/Resources/ProductResource.php @@ -0,0 +1,18 @@ +resource->toArray(); + } +} diff --git a/backend/app/Models/Product.php b/backend/app/Models/Product.php index cf431ca..c0725a3 100644 --- a/backend/app/Models/Product.php +++ b/backend/app/Models/Product.php @@ -16,9 +16,9 @@ class Product extends Model 'product_category_id', ]; - public function productCategory(): BelongsTo + public function category(): BelongsTo { - return $this->belongsTo(ProductCategory::class); + return $this->belongsTo(ProductCategory::class, 'product_category_id'); } public function images(): HasMany diff --git a/backend/routes/api.php b/backend/routes/api.php index eec46f1..5d8329d 100644 --- a/backend/routes/api.php +++ b/backend/routes/api.php @@ -15,6 +15,6 @@ Route::get('/user', [AuthenticatedUserController::class, 'show']); Route::post('/logout', [AuthenticatedUserController::class, 'destroy']); Route::post('/upload/images', action: [ProductImagesController::class, 'store']); - Route::apiResource('products', ProductController::class); }); Route::get('/categories', [ProductCategoryController::class, 'index']); +Route::apiResource('products', ProductController::class);