Skip to content

Commit

Permalink
Deactivating membership if full member user membership is deleted
Browse files Browse the repository at this point in the history
  • Loading branch information
Jnesselr committed Sep 29, 2024
1 parent 28d3fd4 commit 6f71d99
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 2 deletions.
4 changes: 3 additions & 1 deletion app/Aggregates/MembershipAggregate.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public function __construct()
$booted = [];

foreach (class_uses_recursive($class) as $trait) {
$method = 'boot'.class_basename($trait);
$method = 'boot' . class_basename($trait);

if (method_exists($class, $method) && ! in_array($method, $booted)) {
$this->$method();
Expand Down Expand Up @@ -234,6 +234,8 @@ public function deleteUserMembership($membership): static

$this->recordThat(new UserMembershipDeleted($membership));

$this->handleUserMembershipDeleted($membership['id']);

return $this;
}

Expand Down
2 changes: 1 addition & 1 deletion app/Aggregates/MembershipTraits/Cards.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ trait Cards

public Collection $cardsEverActivated; // Cards that have ever been activated. Cards are not removed on deactivation.

public function bootCards()
public function bootCards(): void
{
$this->cardsOnAccount = collect();
$this->cardsNeedingActivation = collect();
Expand Down
21 changes: 21 additions & 0 deletions app/Aggregates/MembershipTraits/UserMembership.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@
trait UserMembership
{
public bool $activeFullMemberPlan = false;
public array $userMembershipIdToPlanId;

public function bootUserMembership(): void
{
$this->userMembershipIdToPlanId = [];
}

public function handleUserMembership($userMembership): void
{
Expand All @@ -17,6 +23,19 @@ public function handleUserMembership($userMembership): void
}
}

public function handleUserMembershipDeleted($userMembershipId): void
{
if (! array_key_exists($userMembershipId, $this->userMembershipIdToPlanId)) {
// This shouldn't happen, but we'd like to report the exception just in case so someone can investigate.
throw new \Exception("Did not find deleted user membership: $userMembershipId");
}

$planId = $this->userMembershipIdToPlanId[$userMembershipId];
if ($planId == \App\Models\UserMembership::MEMBERSHIP_FULL_MEMBER) {
$this->deactivateMembershipIfNeeded();
}
}

protected function handleFullMemberPlan($userMembership): void
{
$currentStatus = $userMembership['status'];
Expand Down Expand Up @@ -47,6 +66,8 @@ protected function applyUserMembershipImported(UserMembershipImported $event): v

protected function updateUserMembershipStatus($userMembership): void
{
$this->userMembershipIdToPlanId[$userMembership['id']] = $userMembership['plan_id'];

if ($userMembership['plan_id'] == \App\Models\UserMembership::MEMBERSHIP_FULL_MEMBER) {
if ($userMembership['status'] == 'active') {
$this->activeFullMemberPlan = true;
Expand Down
47 changes: 47 additions & 0 deletions tests/Unit/Aggregates/MembershipAggregate/ActiveMembershipTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use App\StorableEvents\WooCommerce\CustomerCreated;
use App\StorableEvents\WooCommerce\CustomerUpdated;
use App\StorableEvents\WooCommerce\UserMembershipCreated;
use App\StorableEvents\WooCommerce\UserMembershipDeleted;
use App\StorableEvents\WooCommerce\UserMembershipUpdated;
use Illuminate\Support\Facades\Event;
use Spatie\EventSourcing\Facades\Projectionist;
Expand Down Expand Up @@ -185,6 +186,52 @@ public function user_membership_from_active_to_expired_deactivates_membership():
]);
}

/** @test */
public function user_membership_deleted_deactivates_membership(): void
{
$customer = $this->customer();

$oldUserMembership = $this->userMembership()->plan(UserMembership::MEMBERSHIP_FULL_MEMBER)
->status('active');
$deletedPayload = ['id' => $oldUserMembership->id];

MembershipAggregate::fakeCustomer($customer)
->given([
new CustomerCreated($customer),
new UserMembershipCreated($oldUserMembership),
new MembershipActivated($customer->id),
])
->deleteUserMembership($deletedPayload)
->assertRecorded([
new UserMembershipDeleted($deletedPayload),
new MembershipDeactivated($customer->id),
]);
}

/** @test */
public function user_membership_deleted_does_not_deactivate_if_plan_is_not_membership_plan(): void
{
$customer = $this->customer();

$userMembershipMember = $this->userMembership()->id(5)->plan(UserMembership::MEMBERSHIP_FULL_MEMBER)
->status('active');
$userMembership3DP = $this->userMembership()->id(6)->plan(UserMembership::MEMBERSHIP_3DP_USER)
->status('active');
$deletedPayload = ['id' => $userMembership3DP->id];

MembershipAggregate::fakeCustomer($customer)
->given([
new CustomerCreated($customer),
new UserMembershipCreated($userMembership3DP),
new UserMembershipCreated($userMembershipMember),
new MembershipActivated($customer->id),
])
->deleteUserMembership($deletedPayload)
->assertRecorded([
new UserMembershipDeleted($deletedPayload),
]);
}

/** @test */
public function user_membership_from_active_to_active_does_nothing(): void
{
Expand Down

0 comments on commit 6f71d99

Please sign in to comment.