# Demote team membership
# Definition
Update the plan of a given team to free
and disable projects that are no longer included in the plan.
class DemoteTeamMembership
{
use AsAction;
public string $commandSignature = 'teams:demote {team_id}';
public string $commandDescription = 'Demote the team with the given id.';
public function handle(Team $team): void
{
$team->update(['plan' => 'free' ]);
$numberOfProjectsAllowed = config('app.plans.free.number_of_projects');
if ($team->projects()->count() <= $numberOfProjectsAllowed) {
return;
}
$team->projects()
->orderBy('created_at')
->skip($numberOfProjectsAllowed)
->update(['disabled_at' => now()]);
}
public function asListener(PaymentFailed $event): void
{
$this->handle($event->payment->team);
}
public function asCommand(Command $command): void
{
$team = Team::findOrFail($command->argument('team_id'));
$this->handle($team);
$command->line('Done!');
}
}
# Using as an object
DemoteTeamMembership::run($team);
# Registering as a listener
To make your action listen to a particular event, simply add it to your EventServiceProvider
.
namespace App\Providers;
class EventServiceProvider extends ServiceProvider
{
protected $listen = [
PaymentFailed::class => [
DemoteTeamMembership::class,
],
];
// ...
}
# Using as a command
It could be useful to register the action as command should we need to manually demote a team. To do that we need to register our command in the console Kernel
.
namespace App\Console;
class Kernel extends ConsoleKernel
{
protected $commands = [
DemoteTeamMembership::class,
];
// ...
}
Now we can demote a team of id 42
like this:
php artisan teams:demote 42