Skip to content

Commit

Permalink
Added bulk email add
Browse files Browse the repository at this point in the history
  • Loading branch information
tomlongridge committed Jun 6, 2019
1 parent 641123e commit 4c72663
Show file tree
Hide file tree
Showing 7 changed files with 120 additions and 13 deletions.
30 changes: 28 additions & 2 deletions app/Http/Controllers/SubscriptionController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,12 @@

use App\Board;
use App\User;
use Auth;
use App\BoardSubscription;
use App\Http\Requests\EmailListRequest;

use Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

class SubscriptionController extends Controller
{
Expand All @@ -23,7 +27,29 @@ public function store(Board $board, User $user)

$this->authorize('create', [BoardSubscription::class, $board, $user]);

$board->subscribers()->attach(Auth::user()->id);
$board->subscribers()->attach($user->id);
return back();
}

public function add(Board $board, EmailListRequest $request)
{
$this->authorize('addUser', [BoardSubscription::class, $board, Auth::user()]);

foreach ($request->emails as $email) {
$user = User::where('email', $email["email"])->first();
if ($user == null) {
$user = User::create([
'email' => $email["email"],
'forename' => $email["forename"],
'surname' => $email["surname"],
]);
}

if (!$board->subscribers()->where('id', $user->id)->exists()) {
$board->subscribers()->attach($user->id);
}
}

return back();
}

Expand Down
52 changes: 52 additions & 0 deletions app/Http/Requests/EmailListRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class EmailListRequest extends FormRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'emails' => 'required|array|max:10',
'emails.*.email' => 'required|email',
];
}

public function messages()
{
return [
'emails.*.email' => 'List of recipients contains an invalid email address: :input',
];
}

/**
* Prepare the data for validation.
*
* @return void
*/
protected function prepareForValidation()
{
$this->merge([
'emails' => $this->extractEmailAddresses($this->emails),
]);
}

private function extractEmailAddresses($input)
{
return collect(explode(',', $input))->map(function ($line) {
// Attempt to match line in the format "FirstName Surname" <[email protected]>
if (preg_match('/(?:"?([^"^\s]*)\s?([^"]*)?"?\s)?(?:<?(.+@[^>]+)>?)/', $line, $matches)) {
return ['email' => $matches[3], 'forename' => $matches[1], 'surname' => $matches[2]];
} else {
return ['email' => $line];
}
})->toArray();
}
}
5 changes: 5 additions & 0 deletions app/Policies/SubscriptionPolicy.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ public function create(?User $user, Board $board, User $subscriber)
}
}

public function addUser(?User $user, Board $board)
{
return $board->owner->id == $user->id;
}

/**
* Determine whether the user can delete the board subscription.
*
Expand Down
6 changes: 3 additions & 3 deletions database/migrations/2014_10_12_000000_create_users_table.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('forename');
$table->string('forename')->nullable();
$table->string('middle_initials')->nullable();
$table->string('surname');
$table->string('surname')->nullable();
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->string('password')->nullable();
$table->string('phone')->nullable();
$table->string('address')->nullable();
$table->rememberToken();
Expand Down
2 changes: 1 addition & 1 deletion resources/views/boards/details.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
<p>
Affiliates:
<ul>
@foreach($board->affiliates as $affiliate)
@foreach($board->affiliates as $affiliate)
<li><a href="{{ route('boards.show', ['board' => $affiliate->name]) }}">{{ $affiliate->name }}</a></li>
@endforeach
</ul>
Expand Down
15 changes: 15 additions & 0 deletions resources/views/boards/members.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,19 @@
</ul>
@endif

<h2>Add Users</h2>
<form method="POST" action="{{ route('subscriptions.email', ['board' => $board->name]) }}">
@csrf
<textarea name="emails" class="form-control">{{ old('emails') }}</textarea>
<button type="submit" class="btn btn-primary">Add</button>
</form>

@if(!$errors->isEmpty())
<ul class="alert alert-danger">
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif

@endsection
23 changes: 16 additions & 7 deletions routes/web.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,35 @@
| contains the "web" middleware group. Now create something great!
|
*/
Auth::routes(['verify' => true]);
Route::get('/account', 'UserController@edit')->name('accounts.edit')->middleware('verified');
Route::patch('/account', 'UserController@update')->name('accounts.update')->middleware('verified');

// Home
Route::get('/', function () {
return view('welcome');
})->name('home');

// Authentication and accounts
Auth::routes(['verify' => true]);
Route::get('/account', 'UserController@edit')->name('accounts.edit')->middleware('verified');
Route::patch('/account', 'UserController@update')->name('accounts.update')->middleware('verified');

// API's
Route::resource('/api/towers', 'TowerController');

// Boards
Route::get('/boards/search', 'BoardController@search')->name('boards.search');
Route::resource('/boards', 'BoardController');
Route::get('/boards/{board}/committee', 'BoardController@committee')->name('boards.committee');
Route::get('/boards/{board}/details', 'BoardController@details')->name('boards.details');
Route::get('/boards/{board}/contact', 'BoardController@contact')->name('boards.contact');
Route::get('/boards/{board}/members', 'BoardController@members')->name('boards.members');
Route::resource('/boards/{board}/notices', 'BoardNoticeController');
// Route::get('/boards/{board}/notices/{notice}/mail', 'BoardNoticeController@mail');

// Notices
Route::get('/notices', 'UserNoticeController@index')->name('users.notices');
Route::resource('/boards/{board}/notices', 'BoardNoticeController');
// Route::get('/boards/{board}/notices/{notice}/mail', 'BoardNoticeController@mail');

Route::post('/boards/{board}/subscriptions/{user?}', 'SubscriptionController@store')->name('subscriptions.store');
Route::delete('/boards/{board}/subscriptions/{user?}', 'SubscriptionController@destroy')->name('subscriptions.destroy');
// Subscription
Route::post('/boards/{board}/subscriptions/users/{user?}', 'SubscriptionController@store')->name('subscriptions.store');
Route::delete('/boards/{board}/subscriptions/users/{user?}', 'SubscriptionController@destroy')
->name('subscriptions.destroy');
Route::post('/boards/{board}/subscriptions/emails', 'SubscriptionController@add')->name('subscriptions.email');

0 comments on commit 4c72663

Please sign in to comment.