Refactor: update address when order creation request is being sent with different address id.

This commit is contained in:
kusowl 2026-03-19 16:36:55 +05:30
parent d065ef1db9
commit 783ae6925b
11 changed files with 24 additions and 33 deletions

View File

@ -9,35 +9,29 @@
use App\Models\Cart; use App\Models\Cart;
use App\Models\Order; use App\Models\Order;
use App\Models\User; use App\Models\User;
use Illuminate\Http\JsonResponse;
final readonly class CreateOrderAction final readonly class CreateOrderAction
{ {
/** /**
* Execute the action. * Execute the action.
*
* @throws StaleCartException * @throws StaleCartException
*/ */
public function execute(OrderRequestDTO $dto, User $user): JsonResponse public function execute(OrderRequestDTO $dto, User $user): Order
{ {
/** @var Cart $cart */ /** @var Cart $cart */
$cart = Cart::query()->where('id', $dto->cartId)->sole(); $cart = $user->carts()->where('id', $dto->cartId)->sole();
if ($cart->status !== CartStatus::Active) { if ($cart->status !== CartStatus::Active) {
throw new StaleCartException(userId: $user->id, cartId: $cart->id); 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 */ /** @var Address $address */
$address = $user->addresses()->where('id', $dto->addressId)->sole(); $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 */ /** @var Order $order */
$order = $user->orders()->make(); $order = $user->orders()->firstOrNew(['cart_id' => $cart->id]);
$order->cart_id = $cart->id; $order->cart_id = $cart->id;
$order->shipping_first_name = $address->first_name; $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_city = $address->city;
$order->shipping_state = $address->state; $order->shipping_state = $address->state;
$order->shipping_pin = $address->pin; $order->shipping_pin = $address->pin;
$order->save(); $order->save();
return response()->json([ return $order;
'message' => 'Order created successfully'
], 201);
} }
} }

View File

@ -23,8 +23,7 @@ public function toArray(): array
public static function fromModel(Model $model): OutputDataTransferObject public static function fromModel(Model $model): OutputDataTransferObject
{ {
return new self( return new self;
// TODO: Map model data to properties // TODO: Map model data to properties
);
} }
} }

View File

@ -4,9 +4,9 @@
use App\Actions\CreateOrderAction; use App\Actions\CreateOrderAction;
use App\Data\OrderRequestDTO; use App\Data\OrderRequestDTO;
use App\Exceptions\StaleCartException;
use App\Http\Requests\StoreOrderRequest; use App\Http\Requests\StoreOrderRequest;
use App\Http\Requests\UpdateOrderRequest; use App\Http\Requests\UpdateOrderRequest;
use App\Http\Resources\OrderResource;
use App\Models\Order; use App\Models\Order;
class OrderController extends Controller class OrderController extends Controller
@ -21,10 +21,17 @@ public function index()
/** /**
* Store a newly created resource in storage. * Store a newly created resource in storage.
*
* @throws StaleCartException
*/ */
public function store(StoreOrderRequest $request, CreateOrderAction $action) 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);
} }
/** /**

View File

@ -32,6 +32,8 @@ public function index(Request $request)
*/ */
public function store(AddUserAddressRequest $request, SaveUserAddressAction $action) public function store(AddUserAddressRequest $request, SaveUserAddressAction $action)
{ {
sleep(5);
return new AddressResource($action->execute(AddUserAddressRequestDTO::fromRequest($request), $request->user())); 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) public function update(UpdateUserAddressRequest $request, Address $address, UpdateUserAddressAction $action)
{ {
sleep(5);
return new AddressResource($action->execute(UpdateUserAddressRequestDTO::fromRequest($request), $address)); return new AddressResource($action->execute(UpdateUserAddressRequestDTO::fromRequest($request), $address));
} }

View File

@ -2,10 +2,8 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Support\Carbon;
/** /**
* @mixin IdeHelperAddress * @mixin IdeHelperAddress

View File

@ -5,11 +5,9 @@
use App\Enums\CartStatus; use App\Enums\CartStatus;
use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Support\Carbon;
/** /**
* @mixin IdeHelperCart * @mixin IdeHelperCart

View File

@ -13,7 +13,7 @@ class Order extends Model
{ {
public $fillable = [ public $fillable = [
'user_id', 'cart_id', 'status', 'shipping_city', 'shipping_street', 'shipping_last_name', 'shipping_first_name', '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 public function user(): BelongsTo

View File

@ -4,12 +4,10 @@
use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Carbon;
use Illuminate\Support\Str; use Illuminate\Support\Str;
/** /**

View File

@ -3,7 +3,6 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Carbon;
/** /**
* @mixin IdeHelperProductCategory * @mixin IdeHelperProductCategory

View File

@ -4,7 +4,6 @@
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Carbon;
/** /**
* @mixin IdeHelperProductImage * @mixin IdeHelperProductImage

View File

@ -5,15 +5,11 @@
// use Illuminate\Contracts\Auth\MustVerifyEmail; // use Illuminate\Contracts\Auth\MustVerifyEmail;
use App\Enums\UserRoles; use App\Enums\UserRoles;
use Database\Factories\UserFactory; use Database\Factories\UserFactory;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\DatabaseNotification;
use Illuminate\Notifications\DatabaseNotificationCollection;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Carbon;
/** /**
* @mixin IdeHelperUser * @mixin IdeHelperUser