diff --git a/backend/app/Actions/CreateOrderAction.php b/backend/app/Actions/CreateOrderAction.php index ec17b24..a1078cd 100644 --- a/backend/app/Actions/CreateOrderAction.php +++ b/backend/app/Actions/CreateOrderAction.php @@ -9,35 +9,29 @@ use App\Models\Cart; use App\Models\Order; use App\Models\User; -use Illuminate\Http\JsonResponse; final readonly class CreateOrderAction { /** * Execute the action. + * * @throws StaleCartException */ - public function execute(OrderRequestDTO $dto, User $user): JsonResponse + public function execute(OrderRequestDTO $dto, User $user): Order { /** @var Cart $cart */ - $cart = Cart::query()->where('id', $dto->cartId)->sole(); + $cart = $user->carts()->where('id', $dto->cartId)->sole(); if ($cart->status !== CartStatus::Active) { throw new StaleCartException(userId: $user->id, cartId: $cart->id); } - // check if the user has an order with the same cart id - if ($user->orders()->where('cart_id', $cart->id)->exists()) { - return response()->json([ - 'message' => 'User already has an order with this cart' - ]); - } - /** @var Address $address */ $address = $user->addresses()->where('id', $dto->addressId)->sole(); + // Check if user has already created an order with the same cart. If yes, then take that order. /** @var Order $order */ - $order = $user->orders()->make(); + $order = $user->orders()->firstOrNew(['cart_id' => $cart->id]); $order->cart_id = $cart->id; $order->shipping_first_name = $address->first_name; @@ -46,10 +40,9 @@ public function execute(OrderRequestDTO $dto, User $user): JsonResponse $order->shipping_city = $address->city; $order->shipping_state = $address->state; $order->shipping_pin = $address->pin; + $order->save(); - return response()->json([ - 'message' => 'Order created successfully' - ], 201); + return $order; } } diff --git a/backend/app/Data/OrderResponeDTO.php b/backend/app/Data/OrderResponeDTO.php index a496ca4..e04b4a0 100644 --- a/backend/app/Data/OrderResponeDTO.php +++ b/backend/app/Data/OrderResponeDTO.php @@ -23,8 +23,7 @@ public function toArray(): array public static function fromModel(Model $model): OutputDataTransferObject { - return new self( - // TODO: Map model data to properties - ); + return new self; + // TODO: Map model data to properties } } diff --git a/backend/app/Http/Controllers/OrderController.php b/backend/app/Http/Controllers/OrderController.php index f15410b..9fabad4 100644 --- a/backend/app/Http/Controllers/OrderController.php +++ b/backend/app/Http/Controllers/OrderController.php @@ -4,9 +4,9 @@ use App\Actions\CreateOrderAction; use App\Data\OrderRequestDTO; +use App\Exceptions\StaleCartException; use App\Http\Requests\StoreOrderRequest; use App\Http\Requests\UpdateOrderRequest; -use App\Http\Resources\OrderResource; use App\Models\Order; class OrderController extends Controller @@ -21,10 +21,17 @@ public function index() /** * Store a newly created resource in storage. + * + * @throws StaleCartException */ public function store(StoreOrderRequest $request, CreateOrderAction $action) { - return $action->execute(OrderRequestDTO::fromRequest($request), $request->user()); + $order = $action->execute(OrderRequestDTO::fromRequest($request), $request->user()); + + return response()->json([ + 'message' => 'Order created successfully', + 'orderId' => $order->id, + ], 201); } /** diff --git a/backend/app/Http/Controllers/UserAddressController.php b/backend/app/Http/Controllers/UserAddressController.php index 1f7f5d5..290df90 100644 --- a/backend/app/Http/Controllers/UserAddressController.php +++ b/backend/app/Http/Controllers/UserAddressController.php @@ -32,6 +32,8 @@ public function index(Request $request) */ public function store(AddUserAddressRequest $request, SaveUserAddressAction $action) { + sleep(5); + return new AddressResource($action->execute(AddUserAddressRequestDTO::fromRequest($request), $request->user())); } @@ -48,6 +50,8 @@ public function show(Address $address) */ public function update(UpdateUserAddressRequest $request, Address $address, UpdateUserAddressAction $action) { + sleep(5); + return new AddressResource($action->execute(UpdateUserAddressRequestDTO::fromRequest($request), $address)); } diff --git a/backend/app/Models/Address.php b/backend/app/Models/Address.php index 3844236..a378e23 100644 --- a/backend/app/Models/Address.php +++ b/backend/app/Models/Address.php @@ -2,10 +2,8 @@ namespace App\Models; -use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; -use Illuminate\Support\Carbon; /** * @mixin IdeHelperAddress diff --git a/backend/app/Models/Cart.php b/backend/app/Models/Cart.php index 7345b90..5ce007f 100644 --- a/backend/app/Models/Cart.php +++ b/backend/app/Models/Cart.php @@ -5,11 +5,9 @@ use App\Enums\CartStatus; use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Builder; -use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; -use Illuminate\Support\Carbon; /** * @mixin IdeHelperCart diff --git a/backend/app/Models/Order.php b/backend/app/Models/Order.php index bf12f79..1cfe547 100644 --- a/backend/app/Models/Order.php +++ b/backend/app/Models/Order.php @@ -13,7 +13,7 @@ class Order extends Model { public $fillable = [ 'user_id', 'cart_id', 'status', 'shipping_city', 'shipping_street', 'shipping_last_name', 'shipping_first_name', - 'shipping_state', 'shipping_pin' + 'shipping_state', 'shipping_pin', ]; public function user(): BelongsTo diff --git a/backend/app/Models/Product.php b/backend/app/Models/Product.php index f5f07c4..3701db0 100644 --- a/backend/app/Models/Product.php +++ b/backend/app/Models/Product.php @@ -4,12 +4,10 @@ use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Builder; -use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; -use Illuminate\Support\Carbon; use Illuminate\Support\Str; /** diff --git a/backend/app/Models/ProductCategory.php b/backend/app/Models/ProductCategory.php index 4fe59a1..3bfc999 100644 --- a/backend/app/Models/ProductCategory.php +++ b/backend/app/Models/ProductCategory.php @@ -3,7 +3,6 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Carbon; /** * @mixin IdeHelperProductCategory diff --git a/backend/app/Models/ProductImage.php b/backend/app/Models/ProductImage.php index de726ff..d0097c4 100644 --- a/backend/app/Models/ProductImage.php +++ b/backend/app/Models/ProductImage.php @@ -4,7 +4,6 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; -use Illuminate\Support\Carbon; /** * @mixin IdeHelperProductImage diff --git a/backend/app/Models/User.php b/backend/app/Models/User.php index 899e968..4445f3b 100644 --- a/backend/app/Models/User.php +++ b/backend/app/Models/User.php @@ -5,15 +5,11 @@ // use Illuminate\Contracts\Auth\MustVerifyEmail; use App\Enums\UserRoles; use Database\Factories\UserFactory; -use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Foundation\Auth\User as Authenticatable; -use Illuminate\Notifications\DatabaseNotification; -use Illuminate\Notifications\DatabaseNotificationCollection; use Illuminate\Notifications\Notifiable; -use Illuminate\Support\Carbon; /** * @mixin IdeHelperUser @@ -76,7 +72,7 @@ public function hasFavorited(Product $product): bool /** * @return HasMany */ - public function carts():HasMany + public function carts(): HasMany { return $this->hasMany(Cart::class); }