Skip to content

Commit

Permalink
Merge pull request #78 from mettle/feature/delete-draft-messages
Browse files Browse the repository at this point in the history
[FEATURE] Delete draft messages
  • Loading branch information
JonoB authored Oct 2, 2020
2 parents 1de3ca6 + afa0b1e commit 67f9809
Show file tree
Hide file tree
Showing 8 changed files with 164 additions and 1 deletion.
3 changes: 3 additions & 0 deletions resources/lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
":user was removed from :workspace": ":user was removed from :workspace",
":userName has invited you to join their workspace on SendPortal": ":userName has invited you to join their workspace on SendPortal",
"A fresh verification link has been sent to your email address": "A fresh verification link has been sent to your email address",
"A sent message cannot be deleted": "A sent message cannot be deleted",
"A test email address is required": "A test email address is required",
"Accept": "Accept",
"Actions": "Actions",
Expand Down Expand Up @@ -224,7 +225,9 @@
"The Mailgun Email Service requires you to enter a zone": "The Mailgun Email Service requires you to enter a zone",
"The Mailjet Email Service requires you to enter a key": "The Mailjet Email Service requires you to enter a key",
"The message was sent successfully": "The message was sent successfully",
"No messages selected": "No messages selected",
"The messages were sent successfully": "The messages were sent successfully",
"The message was deleted": "The message was deleted",
"The number of subscribers for this campaign exceeds your SES quota": "The number of subscribers for this campaign exceeds your SES quota",
"The Postmark Email Service requires you to enter a key": "The Postmark Email Service requires you to enter a key",
"The selected message has already been sent": "The selected message has already been sent",
Expand Down
17 changes: 16 additions & 1 deletion resources/views/messages/index.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -94,12 +94,17 @@
</td>
@if(request()->route()->named('sendportal.messages.draft') && ! $message->sent_at)
<td>
<form action="{{ route('sendportal.messages.send') }}" method="post">
<form action="{{ route('sendportal.messages.send') }}" method="post" class="d-inline-block">
@csrf
<input type="hidden" name="id" value="{{ $message->id }}">
<a href="{{ route('sendportal.messages.show', $message->id) }}" class="btn btn-xs btn-light">{{ __('Preview') }}</a>
<button type="submit" class="btn btn-xs btn-light">{{ __('Send Now') }}</button>
</form>
<form action="{{ route('sendportal.messages.delete', $message->id) }}" method="post" class="d-inline-block delete-message">
@csrf
@method('delete')
<button type="submit" class="btn btn-xs btn-light">{{ __('Delete') }}</button>
</form>
</td>
<td>
<input type="checkbox" name="messages[]" value="{{ $message->id }}" class="message-select" form="send-selected-form">
Expand All @@ -126,6 +131,16 @@
$('#select-all').click(function () {
$('.message-select').prop('checked', true);
});
$('.delete-message').submit(function (event) {
event.preventDefault();
let confirmDelete = confirm('Are you sure you want to delete this message?');
if(confirmDelete) {
this.submit();
}
});
})
</script>
@endpush
Expand Down
1 change: 1 addition & 0 deletions routes/web.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
$messageRouter->get('draft', 'MessagesController@draft')->name('draft');
$messageRouter->get('{id}/show', 'MessagesController@show')->name('show');
$messageRouter->post('send', 'MessagesController@send')->name('send');
$messageRouter->delete('{id}/delete', 'MessagesController@delete')->name('delete');
$messageRouter->post('send-selected', 'MessagesController@sendSelected')->name('send-selected');
});

Expand Down
36 changes: 36 additions & 0 deletions src/Http/Controllers/MessagesController.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use Exception;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Gate;
use Illuminate\View\View;
use Sendportal\Base\Models\Message;
use Sendportal\Base\Repositories\Messages\MessageTenantRepositoryInterface;
Expand Down Expand Up @@ -113,13 +114,48 @@ public function send(): RedirectResponse
);
}

/**
* Send a message.
*
* @throws Exception
*/
public function delete(): RedirectResponse
{
if (!$message = $this->messageRepo->find(
auth()->user()->currentWorkspace()->id,
request('id')
)) {
return redirect()->back()->withErrors(__('Unable to locate that message'));
}

$response = Gate::inspect('delete', $message);

if (! $response->allowed()) {
return redirect()->back()->withErrors($response->message());
}

$this->messageRepo->destroy(
auth()->user()->currentWorkspace()->id,
$message->id
);

return redirect()->route('sendportal.messages.draft')->with(
'success',
__('The message was deleted')
);
}

/**
* Send multiple messages.
*
* @throws Exception
*/
public function sendSelected(): RedirectResponse
{
if (! request()->has('messages')) {
return redirect()->back()->withErrors(__('No messages selected'));
}

if (!$messages = $this->messageRepo->getWhereIn(
auth()->user()->currentWorkspace()->id,
request('messages'),
Expand Down
29 changes: 29 additions & 0 deletions src/Policies/MessagePolicy.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

declare(strict_types=1);

namespace Sendportal\Base\Policies;

use Illuminate\Auth\Access\HandlesAuthorization;
use Illuminate\Auth\Access\Response;
use Sendportal\Base\Models\Message;
use Sendportal\Base\Models\User;

class MessagePolicy
{
use HandlesAuthorization;

/**
* Determine whether the user can delete the model.
*
* @param User $user
* @param Message $message
* @return Response
*/
public function delete(User $user, Message $message)
{
return is_null($message->sent_at)
? Response::allow()
: Response::deny(__('A sent message cannot be deleted'));
}
}
32 changes: 32 additions & 0 deletions src/Providers/AuthServiceProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php


namespace Sendportal\Base\Providers;

use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Sendportal\Base\Models\Message;
use Sendportal\Base\Policies\MessagePolicy;

class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
Message::class => MessagePolicy::class
];

/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();

//
}
}
2 changes: 2 additions & 0 deletions src/SendportalBaseServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Sendportal\Base\Console\Commands\CampaignDispatchCommand;
use Sendportal\Base\Console\Commands\GenerateTestSubscribers;
use Sendportal\Base\Console\Commands\SetupProduction;
use Sendportal\Base\Providers\AuthServiceProvider;
use Sendportal\Base\Providers\EventServiceProvider;
use Sendportal\Base\Providers\FormServiceProvider;
use Sendportal\Base\Providers\RouteServiceProvider;
Expand Down Expand Up @@ -61,6 +62,7 @@ public function boot()
public function register()
{
$this->app->register(SendportalAppServiceProvider::class);
$this->app->register(AuthServiceProvider::class);
$this->app->register(EventServiceProvider::class);
$this->app->register(HtmlServiceProvider::class);
$this->app->register(FormServiceProvider::class);
Expand Down
45 changes: 45 additions & 0 deletions tests/Feature/Messages/MessagesControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -80,4 +80,49 @@ public function a_draft_message_can_be_viewed_by_an_authenticated_user()
// then
$response->assertOk();
}

/** @test */
public function a_draft_message_can_be_deleted()
{
[$workspace, $user] = $this->createUserAndWorkspace();

$campaign = factory(Campaign::class)->state('withContent')->create(['workspace_id' => $workspace->id]);

/** @var Message $message */
$message = factory(Message::class)->create([
'workspace_id' => $workspace->id,
'source_id' => $campaign->id,
'sent_at' => null
]);

$this->actingAs($user)
->delete(route('sendportal.messages.delete', $message->id))
->assertRedirect(route('sendportal.messages.draft'));

$this->assertDatabaseMissing('messages', ['id' => $message->id]);
}

/** @test */
public function a_sent_message_cannot_be_deleted()
{
[$workspace, $user] = $this->createUserAndWorkspace();

$campaign = factory(Campaign::class)->state('withContent')->create(['workspace_id' => $workspace->id]);

/** @var Message $message */
$message = factory(Message::class)->create([
'workspace_id' => $workspace->id,
'source_id' => $campaign->id,
'sent_at' => now()
]);

$this
->from(route('sendportal.messages.draft'))
->actingAs($user)
->delete(route('sendportal.messages.delete', $message->id))
->assertRedirect(route('sendportal.messages.draft'))
->assertSessionHasErrorsIn('default');

$this->assertDatabaseHas('messages', ['id' => $message->id]);
}
}

0 comments on commit 67f9809

Please sign in to comment.