This commit is contained in:
2025-09-25 03:03:31 +05:00
commit ae480cf2f6
2768 changed files with 1485826 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
<?php
namespace App\Http\Controllers\Api\V1\Favorite;
use App\Http\Controllers\Api\V1\Favorite\Requests\FavoriteStoreRequest;
use App\Http\Controllers\Api\V1\Favorite\Resources\FavoriteResource;
use App\Http\Controllers\Controller;
use Illuminate\Http\JsonResponse;
class FavoriteController extends Controller
{
/**
* (*) User's favorite products (index)
*/
public function index(): JsonResponse
{
return response()->rest(
FavoriteResource::collection(
auth()->user()->favorites()->with(['product' => ['media', 'brand']])->get()
)
);
}
/**
* (*) Store resource
*/
public function store(FavoriteStoreRequest $request): JsonResponse
{
$data = auth()->user()->favorites()->where('product_id', $request->product_id)->first();
$status = $data
? $data->delete()
: auth()->user()->favorites()->create([
'user_id' => auth()->id(),
'product_id' => $request->product_id,
]);
return response()->rest(
message: is_bool($status) ? 'Removed' : 'Added'
);
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Api\V1\Favorite\Requests;
use Illuminate\Foundation\Http\FormRequest;
class FavoriteStoreRequest extends FormRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules(): array
{
return [
'product_id' => ['required', 'integer', 'exists:products,id'],
];
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Api\V1\Favorite\Resources;
use App\Http\Controllers\Api\V1\Product\Resources\ProductResource;
use Illuminate\Http\Resources\Json\JsonResource;
class FavoriteResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request): array
{
return [
'created_at' => $this->created_at,
'product' => new ProductResource($this->whenLoaded('product')),
];
}
}