diff --git a/app/AttendeeMessage.php b/app/AttendeeMessage.php new file mode 100644 index 0000000..da809a9 --- /dev/null +++ b/app/AttendeeMessage.php @@ -0,0 +1,10 @@ +belongsTo(User::class); } + public function attendeeMessages() + { + return $this->hasMany(AttendeeMessage::class); + } + public function scopePublished($query) { return $query->whereNotNull('published_at'); diff --git a/app/Http/Controllers/Backstage/ConcertMessagesController.php b/app/Http/Controllers/Backstage/ConcertMessagesController.php index 1c7aed4..b99c266 100644 --- a/app/Http/Controllers/Backstage/ConcertMessagesController.php +++ b/app/Http/Controllers/Backstage/ConcertMessagesController.php @@ -14,4 +14,14 @@ class ConcertMessagesController extends Controller return view('backstage.concert-messages.new', ['concert' => $concert]); } + + public function store($id) + { + $concert = Auth::user()->concerts()->findOrFail($id); + + $message = $concert->attendeeMessages()->create(request(['subject', 'message'])); + + return redirect()->route('backstage.concert-messages.new', $concert) + ->with('flash', "Your message has been sent."); + } } diff --git a/database/migrations/2017_08_22_175340_create_attendee_messages_table.php b/database/migrations/2017_08_22_175340_create_attendee_messages_table.php new file mode 100644 index 0000000..7aab1a2 --- /dev/null +++ b/database/migrations/2017_08_22_175340_create_attendee_messages_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->unsignedInteger('concert_id'); + $table->string('subject'); + $table->text('message'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('attendee_messages'); + } +} diff --git a/routes/web.php b/routes/web.php index e5b3dd1..ee7cb01 100644 --- a/routes/web.php +++ b/routes/web.php @@ -30,5 +30,6 @@ Route::group(['middleware' => 'auth', 'prefix' => 'backstage', 'namespace' => 'B Route::get('/published-concerts/{id}/orders', 'PublishedConcertOrdersController@index')->name('backstage.published-concert-orders.index'); Route::get('/concerts/{id}/messages/new', 'ConcertMessagesController@create')->name('backstage.concert-messages.new'); + Route::post('/concerts/{id}/messages', 'ConcertMessagesController@store')->name('backstage.concert-messages.store'); }); diff --git a/tests/Feature/Backstage/MessageAttendeesTest.php b/tests/Feature/Backstage/MessageAttendeesTest.php index 4affb80..ef35756 100644 --- a/tests/Feature/Backstage/MessageAttendeesTest.php +++ b/tests/Feature/Backstage/MessageAttendeesTest.php @@ -5,6 +5,7 @@ namespace Tests\Feature\Backstage; use App\User; use ConcertFactory; use Tests\TestCase; +use App\AttendeeMessage; use Illuminate\Foundation\Testing\DatabaseMigrations; class MessageAttendeesTest extends TestCase @@ -50,4 +51,28 @@ class MessageAttendeesTest extends TestCase $response->assertRedirect('/login'); } + + /** @test */ + function a_promoter_can_send_a_new_message() + { + $this->disableExceptionHandling(); + + $user = factory(User::class)->create(); + $concert = ConcertFactory::createPublished([ + 'user_id' => $user->id, + ]); + + $response = $this->actingAs($user)->post("/backstage/concerts/{$concert->id}/messages", [ + 'subject' => 'My subject', + 'message' => 'My message', + ]); + + $response->assertRedirect("/backstage/concerts/{$concert->id}/messages/new"); + $response->assertSessionHas('flash'); + + $message = AttendeeMessage::first(); + $this->assertEquals($concert->id, $message->concert_id); + $this->assertEquals('My subject', $message->subject); + $this->assertEquals('My message', $message->message); + } }