Refactor: update address when order creation request is being sent with different address id.
This commit is contained in:
parent
d065ef1db9
commit
783ae6925b
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
@ -76,7 +72,7 @@ public function hasFavorited(Product $product): bool
|
|||||||
/**
|
/**
|
||||||
* @return HasMany<Cart>
|
* @return HasMany<Cart>
|
||||||
*/
|
*/
|
||||||
public function carts():HasMany
|
public function carts(): HasMany
|
||||||
{
|
{
|
||||||
return $this->hasMany(Cart::class);
|
return $this->hasMany(Cart::class);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user