Files
monica/app/Console/Commands/Local/SetupDummyAccount.php
T

308 lines
11 KiB
PHP

<?php
namespace App\Console\Commands\Local;
use App\Domains\Contact\ManageContact\Services\CreateContact;
use App\Domains\Contact\ManageContactImportantDates\Services\CreateContactImportantDate;
use App\Domains\Contact\ManageGoals\Services\CreateGoal;
use App\Domains\Contact\ManageGoals\Services\ToggleStreak;
use App\Domains\Contact\ManageNotes\Services\CreateNote;
use App\Domains\Contact\ManageTasks\Services\CreateContactTask;
use App\Domains\Settings\CreateAccount\Services\CreateAccount;
use App\Domains\Vault\ManageJournals\Services\CreateJournal;
use App\Domains\Vault\ManageJournals\Services\CreatePost;
use App\Domains\Vault\ManageVault\Services\CreateVault;
use App\Exceptions\EntryAlreadyExistException;
use App\Models\Contact;
use App\Models\ContactImportantDate;
use App\Models\PostTemplate;
use App\Models\User;
use App\Models\Vault;
use Carbon\Carbon;
use Faker\Factory as Faker;
use Illuminate\Console\Command;
use Illuminate\Console\ConfirmableTrait;
use Symfony\Component\Console\Attribute\AsCommand;
/**
* @codeCoverageIgnore
*/
#[AsCommand(name: 'monica:dummy')]
class SetupDummyAccount extends Command
{
use ConfirmableTrait;
protected ?\Faker\Generator $faker;
protected User $firstUser;
protected User $secondUser;
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'monica:dummy
{--migrate : Use migrate command instead of migrate:fresh.}
{--force : Force the operation to run.}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Prepare an account with fake data so users can play with it';
/**
* Execute the console command.
*/
public function handle(): void
{
// remove queue
config(['queue.default' => 'sync']);
$this->start();
$this->wipeAndMigrateDB();
$this->createFirstUsers();
$this->createVaults();
$this->createContacts();
$this->createNotes();
$this->createTasks();
$this->createGoals();
$this->createJournals();
$this->stop();
}
private function start(): void
{
if (! $this->confirmToProceed('Are you sure you want to proceed? This will delete ALL data in your environment.', true)) {
exit;
}
$this->line('This process will take a few minutes to complete. Be patient and read a book in the meantime.');
$this->faker = Faker::create();
}
private function wipeAndMigrateDB(): void
{
if ($this->option('migrate')) {
$this->artisan('☐ Migration of the database', 'migrate', ['--force' => true]);
} else {
$this->artisan('☐ Migration of the database', 'migrate:fresh', ['--force' => true]);
}
$this->artisan('☐ Reset search engine', 'scout:setup', ['--force' => true, '--flush' => true]);
}
private function stop(): void
{
$this->line('');
$this->line('-----------------------------');
$this->line('|');
$this->line('| Welcome to Monica');
$this->line('|');
$this->line('-----------------------------');
$this->info('| You can now sign in with one of these two accounts:');
$this->line('| An account with a lot of data:');
$this->line('| username: admin@admin.com');
$this->line('| password: admin123');
$this->line('|----------------------------');
$this->line('|A blank account:');
$this->line('| username: blank@blank.com');
$this->line('| password: blank123');
$this->line('|----------------------------');
$this->line('| URL: '.config('app.url'));
$this->line('-----------------------------');
$this->info('Setup is done. Have fun.');
}
private function createFirstUsers(): void
{
$this->info('☐ Create first user of the account');
$this->firstUser = app(CreateAccount::class)->execute([
'email' => 'admin@admin.com',
'password' => 'admin123',
'first_name' => 'Michael',
'last_name' => 'Scott',
]);
$this->firstUser->email_verified_at = Carbon::now();
$this->firstUser->save();
}
private function createVaults(): void
{
$this->info('☐ Create vaults');
for ($i = 0; $i < rand(3, 5); $i++) {
(new CreateVault)->execute([
'account_id' => $this->firstUser->account_id,
'author_id' => $this->firstUser->id,
'type' => Vault::TYPE_PERSONAL,
'name' => $this->faker->firstName,
'description' => rand(1, 2) == 1 ? $this->faker->sentence() : null,
]);
}
}
private function createContacts(): void
{
$this->info('☐ Create contacts');
foreach (Vault::all() as $vault) {
for ($i = 0; $i < rand(2, 13); $i++) {
$date = $this->faker->dateTimeThisCentury();
$birthDate = Carbon::parse($date);
$contact = (new CreateContact)->execute([
'account_id' => $this->firstUser->account_id,
'author_id' => $this->firstUser->id,
'vault_id' => $vault->id,
'first_name' => $this->faker->firstName(),
'last_name' => $this->faker->lastName(),
'middle_name' => rand(1, 2) == 1 ? $this->faker->lastName() : null,
'nickname' => null,
'maiden_name' => null,
'listed' => true,
]);
(new CreateContactImportantDate)->execute([
'account_id' => $this->firstUser->account_id,
'author_id' => $this->firstUser->id,
'vault_id' => $vault->id,
'contact_id' => $contact->id,
'label' => 'Birthdate',
'day' => $birthDate->day,
'month' => $birthDate->month,
'year' => rand(1, 2) == 1 ? $birthDate->year : null,
'type' => ContactImportantDate::TYPE_BIRTHDATE,
]);
}
}
}
private function createNotes(): void
{
$this->info('☐ Create notes');
foreach (Contact::all() as $contact) {
for ($i = 0; $i < 4; $i++) {
(new CreateNote)->execute([
'account_id' => $this->firstUser->account_id,
'author_id' => $this->firstUser->id,
'vault_id' => $contact->vault_id,
'contact_id' => $contact->id,
'title' => rand(1, 2) == 1 ? $this->faker->sentence(rand(3, 6)) : null,
'body' => $this->faker->paragraph(),
]);
}
}
}
private function createTasks(): void
{
$this->info('☐ Create tasks');
foreach (Contact::all() as $contact) {
for ($i = 0; $i < 4; $i++) {
(new CreateContactTask)->execute([
'account_id' => $this->firstUser->account_id,
'author_id' => $this->firstUser->id,
'vault_id' => $contact->vault_id,
'contact_id' => $contact->id,
'label' => $this->faker->sentence(rand(3, 6)),
'description' => null,
]);
}
}
}
private function createGoals(): void
{
$this->info('☐ Create goals');
$goals = collect([
'Lose 5 kgs',
'Practice sport every day',
'Develop Monica every day',
'Kiss my wife',
]);
foreach (Contact::all() as $contact) {
foreach ($goals->take(rand(1, 4)) as $goal) {
$goal = (new CreateGoal)->execute([
'account_id' => $this->firstUser->account_id,
'author_id' => $this->firstUser->id,
'vault_id' => $contact->vault_id,
'contact_id' => $contact->id,
'name' => $goal,
]);
for ($i = 0; $i < 4; $i++) {
$date = Carbon::now()->subYears(2);
for ($j = 0; $j < rand(1, 20); $j++) {
$date = $date->addDays(rand(1, 3));
try {
(new ToggleStreak)->execute([
'account_id' => $this->firstUser->account_id,
'author_id' => $this->firstUser->id,
'vault_id' => $contact->vault_id,
'contact_id' => $contact->id,
'goal_id' => $goal->id,
'happened_at' => $date->format('Y-m-d'),
]);
} catch (EntryAlreadyExistException) {
continue;
}
}
}
}
}
}
private function createJournals(): void
{
$this->info('☐ Create journals');
$journals = collect([
'Road trip',
'My private diary',
'Journal of 2022',
'Incredible stories',
]);
foreach (Vault::all() as $vault) {
foreach ($journals->take(rand(1, 4)) as $journal) {
$journal = (new CreateJournal)->execute([
'account_id' => $this->firstUser->account_id,
'author_id' => $this->firstUser->id,
'vault_id' => $vault->id,
'name' => $journal,
'description' => rand(1, 2) == 1 ? $this->faker->sentence() : null,
]);
for ($j = 0; $j < rand(1, 20); $j++) {
(new CreatePost)->execute([
'account_id' => $this->firstUser->account_id,
'author_id' => $this->firstUser->id,
'vault_id' => $vault->id,
'journal_id' => $journal->id,
'post_template_id' => PostTemplate::where('account_id', $this->firstUser->account_id)->inRandomOrder()->first()->id,
'title' => $this->faker->sentence(),
'published' => false,
'written_at' => $this->faker->dateTimeThisYear()->format('Y-m-d'),
]);
}
}
}
}
private function artisan(string $message, string $command, array $arguments = []): void
{
$this->info($message);
$this->callSilent($command, $arguments);
}
}