app/Services/Auth/Population/PopulateLifeEventsTable.php (93 lines of code) (raw):

<?php namespace App\Services\Auth\Population; use App\Services\BaseService; use App\Models\Account\Account; use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\App; use App\Models\Contact\LifeEventType; use Illuminate\Database\QueryException; use App\Models\Contact\LifeEventCategory; /** * Populate life event types and life event categories for a given account. * This is typically done when a new account is created. */ class PopulateLifeEventsTable extends BaseService { /** * Get the validation rules that apply to the service. * * @return array */ public function rules() { return [ 'account_id' => 'required|integer|exists:accounts,id', 'migrate_existing_data' => 'required|boolean', ]; } /** * The data needed for the query to be executed. * * @var array */ private $data; /** * Execute the service. * * @param array $givenData * @return bool */ public function execute(array $givenData): bool { $this->data = $givenData; if (! $this->validate($this->data)) { return false; } $locale = $this->getLocaleOfAccount($this->data['account_id']); if (is_null($locale)) { return false; } $this->createEntries($locale); $this->markTableAsMigrated(); return true; } /** * Get the locale associated with the account. * * @return string|null */ private function getLocaleOfAccount($accountId) { // get the account $account = Account::findOrFail($accountId); return $account->getFirstLocale(); } /** * Create life event category and life event type entries. * * @return void */ private function createEntries($locale) { App::setLocale($locale); $defaultLifeEventCategories = $this->getDefaultLifeEventCategories(); foreach ($defaultLifeEventCategories as $defaultLifeEventCategory) { $lifeEventCategory = $this->feedLifeEventCategory($defaultLifeEventCategory); $defaultLifeEventTypes = DB::table('default_life_event_types') ->where('default_life_event_category_id', $defaultLifeEventCategory->id) ->get(); foreach ($defaultLifeEventTypes as $defaultLifeEventType) { $this->feedLifeEventType($defaultLifeEventType, $lifeEventCategory); } } } /** * Get the default life event categories. * * @throws QueryException if the query does not run for some reasons. * @return Collection */ private function getDefaultLifeEventCategories() { if ($this->data['migrate_existing_data'] == 1) { $defaultLifeEventCategories = DB::table('default_life_event_categories') ->get(); } else { $defaultLifeEventCategories = DB::table('default_life_event_categories') ->where('migrated', 0) ->get(); } return $defaultLifeEventCategories; } /** * Create an entry in the life event category table. * * @param object $defaultLifeEventCategory * @return LifeEventCategory */ private function feedLifeEventCategory($defaultLifeEventCategory): LifeEventCategory { return LifeEventCategory::create([ 'account_id' => $this->data['account_id'], 'name' => trans('settings.personalization_life_event_category_'.$defaultLifeEventCategory->translation_key), 'core_monica_data' => true, 'default_life_event_category_key' => $defaultLifeEventCategory->translation_key, ]); } /** * Create an entry in the life event type table. * * @param object $defaultLifeEventType * @return void */ private function feedLifeEventType($defaultLifeEventType, $lifeEventCategory) { LifeEventType::create([ 'account_id' => $this->data['account_id'], 'life_event_category_id' => $lifeEventCategory->id, 'name' => trans('settings.personalization_life_event_type_'.$defaultLifeEventType->translation_key), 'core_monica_data' => true, 'specific_information_structure' => $defaultLifeEventType->specific_information_structure, 'default_life_event_type_key' => $defaultLifeEventType->translation_key, ]); } /** * Mark the table as migrated. * * @return void */ private function markTableAsMigrated() { DB::table('default_life_event_categories') ->update(['migrated' => 1]); DB::table('default_life_event_types') ->update(['migrated' => 1]); } }