diff --git a/app/Http/Controllers/ConcertOrdersController.php b/app/Http/Controllers/ConcertOrdersController.php index 17e9a23..9397045 100644 --- a/app/Http/Controllers/ConcertOrdersController.php +++ b/app/Http/Controllers/ConcertOrdersController.php @@ -32,6 +32,7 @@ class ConcertOrdersController extends Controller $this->paymentGateway->charge(request('ticket_quantity') * $concert->ticket_price, request('payment_token')); return response()->json([], 201); } catch (PaymentFailedException $e) { + $order->cancel(); return response()->json([], 422); } catch (NotEnoughTicketsException $e) { return response()->json([], 422); diff --git a/app/Order.php b/app/Order.php index fdd6420..78da2e4 100644 --- a/app/Order.php +++ b/app/Order.php @@ -12,4 +12,13 @@ class Order extends Model { return $this->hasMany(Ticket::class); } + + public function cancel() + { + foreach ($this->tickets as $ticket) { + $ticket->update(['order_id' => null]); + } + + $this->delete(); + } } diff --git a/app/Ticket.php b/app/Ticket.php index 5c90f58..94a8608 100644 --- a/app/Ticket.php +++ b/app/Ticket.php @@ -6,6 +6,8 @@ use Illuminate\Database\Eloquent\Model; class Ticket extends Model { + protected $guarded = []; + public function scopeAvailable($query) { return $query->whereNull('order_id'); diff --git a/tests/unit/OrderTest.php b/tests/unit/OrderTest.php new file mode 100644 index 0000000..18f88e9 --- /dev/null +++ b/tests/unit/OrderTest.php @@ -0,0 +1,26 @@ +create(); + $concert->addTickets(10); + $order = $concert->orderTickets('jane@example.com', 5); + $this->assertEquals(5, $concert->ticketsRemaining()); + + $order->cancel(); + + $this->assertEquals(10, $concert->ticketsRemaining()); + $this->assertNull(Order::find($order->id)); + } +}