Source of file HealthCheckItemProvider.php
Size: 6,821 Bytes - Last Modified: 2021-12-23T10:41:57+00:00
/var/www/docs.ssmods.com/process/src/src/Model/HealthCheckItemProvider.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 | <?php namespace Sunnysideup\HealthCheckProvider\Model; use Exception; use SilverStripe\Core\ClassInfo; use SilverStripe\Core\Injector\Injector; use SilverStripe\Forms\ReadonlyField; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\DB; use SilverStripe\ORM\FieldType\DBField; use SilverStripe\ORM\Filters\ExactMatchFilter; use SilverStripe\ORM\Filters\PartialMatchFilter; use Sunnysideup\HealthCheckProvider\Checks\HealthCheckItemRunner; class HealthCheckItemProvider extends DataObject { protected $runner; ####################### ### Names Section ####################### private static $singular_name = 'Piece of Info'; private static $plural_name = 'Pieces of Info'; private static $table_name = 'HealthCheckItemProvider'; ####################### ### Model Section ####################### private static $belongs_many_many = [ 'HealthCheckProviders' => HealthCheckProvider::class, ]; private static $db = [ 'Include' => 'Boolean', 'RunnerClassName' => 'Varchar(255)', ]; ####################### ### Further DB Field Details ####################### private static $defaults = [ 'Include' => false, ]; private static $searchable_fields = [ 'Include' => ExactMatchFilter::class, 'RunnerClassName' => PartialMatchFilter::class, ]; ####################### ### Field Names and Presentation Section ####################### private static $field_labels = [ 'Include' => 'Are you happy to send this?', 'RunnerClassName' => 'Code', 'HealthCheckProviders' => 'Reports', ]; private static $summary_fields = [ 'CodeNice' => 'Code', 'Include.Nice' => 'Include', 'AnswerSummary' => 'Data', ]; ####################### ### Casting Section ####################### private static $casting = [ 'AnswerSummary' => 'HTMLText', 'AnswerAll' => 'HTMLText', 'Title' => 'Varchar', 'Code' => 'Varchar', 'CodeNice' => 'Varchar', ]; public function getTitle() { return DBField::create_field('HTMLText', $this->getCode()); } public function getCode(): string { if (class_exists($this->RunnerClassName)) { return ClassInfo::shortName($this->RunnerClassName); } return 'error'; } public function getCodeNice(): string { return preg_replace('#([a-z])([A-Z])#s', '$1 $2', $this->getCode()); } public function getAnswerAll() { $data = $this->findAnswer(); return DBField::create_field('HTMLText', '<pre>' . json_encode($data, JSON_PRETTY_PRINT) . '</pre>'); } public function getAnswerSummary() { $data = $this->findAnswer(); $data = $this->summariseData($data); return DBField::create_field('HTMLText', '<pre>' . json_encode($data, JSON_PRETTY_PRINT) . '</pre>'); } ####################### ### can Section ####################### public function canCreate($member = null, $context = null) { return false; } public function canDelete($member = null) { return class_exists($this->RunnerClassName) ? false : parent::canDelete($member); } ####################### ### write Section ####################### public function requireDefaultRecords() { parent::requireDefaultRecords(); foreach (HealthCheckItemProvider::get() as $item) { if (! class_exists($item->RunnerClassName)) { DB::alteration_message('Deleting superfluous: ' . $item->RunnerClassName, 'deleted'); $item->delete(); } } $classes = ClassInfo::subclassesFor(HealthCheckItemRunner::class, false); $ids = [0 => 0]; foreach ($classes as $className) { $filter = ['RunnerClassName' => $className]; $obj = DataObject::get_one(HealthCheckItemProvider::class, $filter); if (! $obj) { $obj = HealthCheckItemProvider::create($filter); DB::alteration_message('Creating Health Check: ' . $obj->getTitle(), 'created'); } $id = $obj->write(); if (! $id) { $id = $obj->ID; } $ids[$id] = $id; } $badOnes = HealthCheckItemProvider::get()->where('HealthCheckItemProvider.ID NOT IN (' . implode(',', $ids) . ')'); foreach ($badOnes as $badOne) { DB::alteration_message('Deleting superfluous: ' . $badOne->getTitle(), 'deleted'); $badOne->delete(); } } public function getCMSFields() { $fields = parent::getCMSFields(); $fields->removeByName('HealthCheckProviders'); $fields->removeByName('RunnerClassName'); $fields->addFieldsToTab( 'Root.Main', [ ReadonlyField::create('CodeNice', 'Code'), ReadonlyField::create('AnswerAll', 'Answer'), ] ); return $fields; } public function getRunner() { if (! $this->runner) { $class = $this->RunnerClassName; if (class_exists($class)) { $this->runner = Injector::inst()->get($this->RunnerClassName, $asSingleton = true, [$this]); } } return $this->runner; } public function findAnswer(): array { $answer = 'error'; $isInstalled = false; $isEnabled = false; if ($this->getRunner()) { try { $answer = $this->getRunner()->getCalculatedAnswer(); $isInstalled = $this->getRunner()->IsInstalled(); $isEnabled = $this->getRunner()->IsEnabled(); } catch (Exception $exception) { $answer = 'Caught exception: ' . $exception->getMessage(); } } return [ 'Answer' => $answer, 'IsInstalled' => $isInstalled, 'IsEnabled' => $isEnabled, ]; } private function summariseData($mixed) { if (is_string($mixed)) { if (strlen($mixed) > 50) { return substr($mixed, 0, 50) . '...'; } } elseif (is_array($mixed)) { $returnArray = []; $count = 0; foreach ($mixed as $key => $item) { ++$count; $returnArray[$this->summariseData($key)] = $this->summariseData($item); if ($count > 3) { $returnArray[] = ' + ' . count($mixed) . ' MORE ...'; break; } } return $returnArray; } return $mixed; } } |