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\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;
}
}

View File

@ -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
}
}

View File

@ -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);
}
/**

View File

@ -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));
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;
/**

View File

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

View File

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

View File

@ -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<Cart>
*/
public function carts():HasMany
public function carts(): HasMany
{
return $this->hasMany(Cart::class);
}