From 7fee2b89ee3d516853c7735c28e270d9096926d9 Mon Sep 17 00:00:00 2001 From: Adam Wathan Date: Wed, 9 Nov 2016 11:16:34 -0500 Subject: [PATCH] 2.6 - Encapsulating Relationship Logic in the Model --- app/Concert.php | 11 +++++++++++ app/Http/Controllers/ConcertOrdersController.php | 12 ++---------- tests/unit/ConcertTest.php | 11 +++++++++++ 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/app/Concert.php b/app/Concert.php index 09f8207..b71ca09 100644 --- a/app/Concert.php +++ b/app/Concert.php @@ -33,4 +33,15 @@ class Concert extends Model { return $this->hasMany(Order::class); } + + public function orderTickets($email, $ticketQuantity) + { + $order = $this->orders()->create(['email' => $email]); + + foreach (range(1, $ticketQuantity) as $i) { + $order->tickets()->create([]); + } + + return $order; + } } diff --git a/app/Http/Controllers/ConcertOrdersController.php b/app/Http/Controllers/ConcertOrdersController.php index 0cf2ce0..0c0755c 100644 --- a/app/Http/Controllers/ConcertOrdersController.php +++ b/app/Http/Controllers/ConcertOrdersController.php @@ -18,16 +18,8 @@ class ConcertOrdersController extends Controller public function store($concertId) { $concert = Concert::find($concertId); - $ticketQuantity = request('ticket_quantity'); - $amount = $ticketQuantity * $concert->ticket_price; - $token = request('payment_token'); - $this->paymentGateway->charge($amount, $token); - - $order = $concert->orders()->create(['email' => request('email')]); - - foreach (range(1, $ticketQuantity) as $i) { - $order->tickets()->create([]); - } + $this->paymentGateway->charge(request('ticket_quantity') * $concert->ticket_price, request('payment_token')); + $order = $concert->orderTickets(request('email'), request('ticket_quantity')); return response()->json([], 201); } diff --git a/tests/unit/ConcertTest.php b/tests/unit/ConcertTest.php index d634a5d..9e933d8 100644 --- a/tests/unit/ConcertTest.php +++ b/tests/unit/ConcertTest.php @@ -53,4 +53,15 @@ class ConcertTest extends TestCase $this->assertTrue($publishedConcerts->contains($publishedConcertB)); $this->assertFalse($publishedConcerts->contains($unpublishedConcert)); } + + /** @test */ + function can_order_concert_tickets() + { + $concert = factory(Concert::class)->create(); + + $order = $concert->orderTickets('jane@example.com', 3); + + $this->assertEquals('jane@example.com', $order->email); + $this->assertEquals(3, $order->tickets()->count()); + } }