Skip to content

Commit 9057fb8

Browse files
committed
Implement subscription email
1 parent d73879f commit 9057fb8

File tree

19 files changed

+162
-37
lines changed

19 files changed

+162
-37
lines changed

app/Helpers/HasUuid.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
namespace App\Helpers;
4+
5+
use Ramsey\Uuid\Uuid;
6+
use Ramsey\Uuid\UuidInterface;
7+
8+
trait HasUuid
9+
{
10+
public function uuid(): UuidInterface
11+
{
12+
return Uuid::fromString($this->uuid);
13+
}
14+
15+
public function getKeyName()
16+
{
17+
return 'uuid';
18+
}
19+
20+
public function getIncrementing()
21+
{
22+
return false;
23+
}
24+
25+
public static function findByUuidOrFail(UuidInterface $uuid): self
26+
{
27+
return static::where('uuid', $uuid->toString())->firstOrFail();
28+
}
29+
}

app/Http/Controllers/Auth/GithubController.php

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public function redirectToProvider()
2929
public function handleProviderCallback()
3030
{
3131
try {
32-
$socialiteUser = Socialite::driver('github')->user();
32+
$socialiteUser = $this->getSocialiteUser();
3333
} catch (InvalidStateException $exception) {
3434
$this->error('errors.github_invalid_state');
3535

@@ -38,16 +38,21 @@ public function handleProviderCallback()
3838

3939
try {
4040
$user = User::findByGithubId($socialiteUser->getId());
41-
42-
return $this->userFound($user, $socialiteUser);
4341
} catch (ModelNotFoundException $exception) {
44-
return $this->userNotFound(new GithubUser($socialiteUser->user));
42+
return $this->userNotFound(new GithubUser($socialiteUser->getRaw()));
4543
}
44+
45+
return $this->userFound($user, $socialiteUser);
46+
}
47+
48+
private function getSocialiteUser(): SocialiteUser
49+
{
50+
return Socialite::driver('github')->user();
4651
}
4752

4853
private function userFound(User $user, SocialiteUser $socialiteUser): RedirectResponse
4954
{
50-
$this->dispatchNow(new UpdateProfile($user, ['github_username' => $socialiteUser->nickname]));
55+
$this->dispatchNow(new UpdateProfile($user, ['github_username' => $socialiteUser->getNickname()]));
5156

5257
Auth::login($user);
5358

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace App\Http\Controllers;
4+
5+
use App\Jobs\UnsubscribeFromSubscriptionAble;
6+
use App\Models\Subscription;
7+
8+
class SubscriptionController extends Controller
9+
{
10+
public function unsubscribe(Subscription $subscription)
11+
{
12+
$thread = $subscription->subscriptionAble();
13+
14+
$this->dispatch(new UnsubscribeFromSubscriptionAble($subscription->user(), $thread));
15+
16+
$this->success("You're now unsubscribed from this thread.");
17+
18+
return redirect()->route('thread', $thread->slug());
19+
}
20+
}

app/Jobs/CreateReply.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use App\Models\ReplyAble;
1010
use App\Events\ReplyWasCreated;
1111
use App\Http\Requests\CreateReplyRequest;
12+
use Ramsey\Uuid\Uuid;
1213

1314
final class CreateReply
1415
{
@@ -56,6 +57,7 @@ public function handle(): Reply
5657

5758
if ($this->replyAble instanceof SubscriptionAble && ! $this->replyAble->hasSubscriber($this->author)) {
5859
$subscription = new Subscription();
60+
$subscription->uuid = Uuid::uuid4()->toString();
5961
$subscription->userRelation()->associate($this->author);
6062
$subscription->subscriptionAbleRelation()->associate($this->replyAble);
6163

app/Jobs/CreateThread.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use App\User;
77
use App\Models\Thread;
88
use App\Http\Requests\ThreadRequest;
9+
use Ramsey\Uuid\Uuid;
910

1011
final class CreateThread
1112
{
@@ -68,6 +69,7 @@ public function handle(): Thread
6869

6970
// Subscribe author to the thread.
7071
$subscription = new Subscription();
72+
$subscription->uuid = Uuid::uuid4()->toString();
7173
$subscription->userRelation()->associate($this->author);
7274
$subscription->subscriptionAbleRelation()->associate($thread);
7375

app/Jobs/SubscribeToSubscriptionAble.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use App\Models\Subscription;
66
use App\User;
77
use App\Models\SubscriptionAble;
8+
use Ramsey\Uuid\Uuid;
89

910
class SubscribeToSubscriptionAble
1011
{
@@ -27,6 +28,7 @@ public function __construct(User $user, SubscriptionAble $subscriptionAble)
2728
public function handle()
2829
{
2930
$subscription = new Subscription();
31+
$subscription->uuid = Uuid::uuid4()->toString();
3032
$subscription->userRelation()->associate($this->user);
3133
$this->subscriptionAble->subscriptionsRelation()->save($subscription);
3234
}

app/Listeners/SendNewReplyNotification.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public function handle(ReplyWasCreated $event): void
1212
{
1313
foreach ($event->reply->replyAble()->subscriptions() as $subscription) {
1414
if ($this->replyAuthorDoesNotMatchSubscriber($event->reply->author(), $subscription)) {
15-
$subscription->user()->notify(new NewReplyNotification($event->reply));
15+
$subscription->user()->notify(new NewReplyNotification($event->reply, $subscription));
1616
}
1717
}
1818
}

app/Mail/NewReplyEmail.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace App\Mail;
44

55
use App\Models\Reply;
6+
use App\Models\Subscription;
67
use Illuminate\Bus\Queueable;
78
use Illuminate\Contracts\Queue\ShouldQueue;
89
use Illuminate\Mail\Mailable;
@@ -17,9 +18,15 @@ class NewReplyEmail extends Mailable implements ShouldQueue
1718
*/
1819
public $reply;
1920

20-
public function __construct(Reply $reply)
21+
/**
22+
* @var \App\Models\Subscription
23+
*/
24+
public $subscription;
25+
26+
public function __construct(Reply $reply, Subscription $subscription)
2127
{
2228
$this->reply = $reply;
29+
$this->subscription = $subscription;
2330
}
2431

2532
public function build()

app/Models/Subscription.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22

33
namespace App\Models;
44

5+
use App\Helpers\HasUuid;
56
use App\User;
67
use Illuminate\Database\Eloquent\Model;
78
use Illuminate\Database\Eloquent\Relations\BelongsTo;
89
use Illuminate\Database\Eloquent\Relations\MorphTo;
910

1011
class Subscription extends Model
1112
{
13+
use HasUuid;
14+
1215
/**
1316
* {@inheritdoc}
1417
*/

app/Notifications/NewReplyNotification.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use App\Mail\NewReplyEmail;
66
use App\Models\Reply;
7+
use App\Models\Subscription;
78
use App\User;
89
use Illuminate\Bus\Queueable;
910
use Illuminate\Notifications\Notification;
@@ -18,9 +19,15 @@ class NewReplyNotification extends Notification implements ShouldQueue
1819
*/
1920
public $reply;
2021

21-
public function __construct(Reply $reply)
22+
/**
23+
* @var \App\Models\Subscription
24+
*/
25+
public $subscription;
26+
27+
public function __construct(Reply $reply, Subscription $subscription)
2228
{
2329
$this->reply = $reply;
30+
$this->subscription = $subscription;
2431
}
2532

2633
public function via(User $user)
@@ -30,7 +37,7 @@ public function via(User $user)
3037

3138
public function toMail(User $user)
3239
{
33-
return (new NewReplyEmail($this->reply))
40+
return (new NewReplyEmail($this->reply, $this->subscription))
3441
->to($user->emailAddress(), $user->name());
3542
}
3643

0 commit comments

Comments
 (0)