Untitled
user_3839718
php
2 years ago
18 kB
5
Indexable
<?php namespace App\Model; use Laminas\Db\Adapter\AdapterInterface; use Laminas\ServiceManager\ServiceManager; use Laminas\Mail\Transport\TransportInterface; use App\Model\User; use App\Helper\QueryBuilder; use Laminas\Db\Sql\Select; abstract class AbstractBaseManager { protected $config; protected $dbAdapter; protected $tableGateways = []; private $viewConfig = [ 'user' => [ 'id' => 'id', 'email' => 'email', 'fullName' => 'fullname', 'nickName' => 'short_name', 'companyName' => 'company_name', 'mobile' => 'mobile', 'legalName' => 'legal_name', 'dateCreated' => 'date_created', 'status' => 'status', 'country' => 'country', 'timeZone' => 'time_zone', 'language' => 'language', 'address' => 'address', 'canWrite' => '', 'canRead' => '' ], 'robot' => ['name' => 'robot_name', 'id' => 'id', 'status' => 'status', 'dateCreated' => 'date_created', 'masterToken' => 'master_token'], 'farm' => [ 'id' => 'id', 'name' => 'name', 'nickName' => 'nick_name', 'address' => 'address', 'country' => 'country_id', 'status' => 'status', 'gps' => 'gps', 'description' => 'description', 'dateCreated' => 'date_created' ], 'round' => [ 'id' => 'id', 'from' => 'from', 'to' => 'to', 'species' => 'species_id', 'targetMortality' => 'target_mortality', 'exportable' => 'exportable', 'gender' => 'gender', 'finalExits' => 'final_exits', 'status' => 'status', 'initialEntry' => 'initial_entries', 'comments' => 'comments' ], 'house' => [ 'id' => 'id', 'name' => 'name', 'nickName' => 'nick_name', 'gps' => 'gps', 'status' => 'status', 'description' => 'description', 'dateCreated' => 'date_created', 'growthCurve' => 'growth_curve', 'temperatureCurve' => 'temperature_curve' ], 'alert' => [ 'id' => 'id', 'notificationMethod' => 'notification_method_id', 'subject' => 'subject', 'message' => 'message', 'level' => 'level', 'time' => 'time', 'date' => 'date_created' ], 'diary' => ['id' => 'id', 'note' => 'note', 'date' => 'date_created'], 'climate_controller' => ['climateType' => 'name_ld'], 'climate' => ['climateController' => 'name'], 'house_type' => ['houseType' => 'name_ld'], ]; //Confirm if this config is needed private $viewConfigAdmin = [ 'user' => [ 'id' => 'id', 'email' => 'email', 'fullName' => 'fullname', 'nickName' => 'short_name', 'companyName' => 'company_name', 'mobile' => 'mobile', 'legalName' => 'legal_name', 'dateCreated' => 'date_created', 'status' => 'status', 'country' => 'country', 'timeZone' => 'time_zone', 'language' => 'language', 'address' => 'address', 'canWrite' => '', 'canRead' => '' ], 'robot' => ['name' => 'robot_name', 'id' => 'id', 'status' => 'status', 'dateCreated' => 'date_created', 'masterToken' => 'master_token'], 'farm' => [ 'id' => 'id', 'name' => 'name', 'nickName' => 'nick_name', 'address' => 'address', 'country' => 'country_id', 'status' => 'status', 'gps' => 'gps', 'description' => 'description', 'dateCreated' => 'date_created' ], 'round' => [ 'id' => 'id', 'house_id' => 'house_id', 'from' => 'from', 'to' => 'to', 'species' => 'species_id', 'targetMortality' => 'target_mortality', 'finalExits' => 'final_exits', 'status' => 'status', 'initialEntry' => 'initial_entries', 'comments' => 'comments' ], 'house' => [ 'id' => 'id', 'name' => 'name', 'nickName' => 'nick_name', 'gps' => 'gps', 'status' => 'status', 'description' => 'description', 'dateCreated' => 'date_created', 'growthCurve' => 'growth_curve', 'temperatureCurve' => 'temperature_curve' ], 'alert_notification' => [ 'id' => 'id', 'notificationMethod' => 'notification_method_id', 'subject' => 'subject', 'message' => 'message', 'level' => 'level', 'time' => 'time', 'date' => 'date_created' ], 'diary' => ['id' => 'id', 'note' => 'note', 'date' => 'date_created'], 'climate_controller' => ['climateType' => 'name_ld'], 'climate' => ['climateController' => 'name'], 'house_type' => ['houseType' => 'name_ld'], ]; const ADMIN = 'admin@faromatics.com'; protected $mailTransport; protected $serviceContainer; protected function __construct(ServiceManager $container) { $this->serviceContainer = $container; $this->config = $container->get('Config'); $this->dbAdapter = $container->get(AdapterInterface::class); $this->mailTransport = $container->get(TransportInterface::class); $this->viewConfig['user']['canWrite'] = new \Laminas\Db\Sql\Expression('1'); $this->viewConfig['user']['canRead'] = new \Laminas\Db\Sql\Expression('1'); } protected function getTableGateway($table) { if (!isset($this->tableGateways[$table])) { $this->tableGateways[$table] = new \Laminas\Db\TableGateway\TableGateway($table, $this->dbAdapter); } return $this->tableGateways[$table]; } protected function getMailTransport() { return $this->mailTransport; } protected function getNewGlobalId($type) { $serialNumber = null; $timeStamp = date("Y-m-d H:i:s"); $table = $this->getTableGateway('global_id'); while (!isset($serialNumber)) { $serialNumber = \Laminas\Math\Rand::getString(6, '123456789abcdefghijklmnopqrstuvwxyz', true); $conversion = bin2hex($serialNumber); $validator = substr('trwagmyfpdxbnjzsqvhlcke', hexdec($conversion) % 23, 1) ?? '0'; $serialNumber = $serialNumber . $validator; $rowset = $table->select(['id' => $serialNumber]); if ($rowset->count() > 0) { // Serial number already in use $serialNumber = null; } } $data = [ 'id' => $serialNumber, 'type' => $type, 'created_by' => User::FAROMATICS_CREATOR_IDENTITY, 'date_created' => $timeStamp, ]; $table->insert($data); return $serialNumber; } protected function createdBy($table, $userId) { $data = [ 'created_by' => User::FAROMATICS_CREATOR_IDENTITY, ]; $table = $this->getTableGateway($table); $table->update($data, ['id' => $userId]); } protected function modifiedBy($table, $userId) { $timeStamp = time(); $data = [ 'modified_by' => User::FAROMATICS_CREATOR_IDENTITY, //'date_modified' => $timeStam ]; $table = $this->getTableGateway($table); $table->update($data, ['id' => $userId]); } protected function getMyCreator($userId) { $select = new Select; $select->from(['u' => 'user']) ->where ->nest() ->equalTo('u.id', $userId) ->and ->notEqualTo('u.created_by', '0000000') ->unnest(); $results = $this->getTableGateway('user'); return $results->selectWith($select)->current()->created_by ?? null; } protected function insert($entity, $data) { $table = $this->getTableGateway($entity); $table->insert($data); } protected function update($entity, $data, $params) { $table = $this->getTableGateway($entity); $table->update($data, $params); } protected function isMyEntity($entity, $entityId, $userId) { $table = $this->getTableGateway($entity); $rowset = $table->select(['id' => $entityId, 'created_by' => $userId])->current(); return isset($rowset) ? true : false; } protected function returnEntity($entity, $params) { $table = $this->getTableGateway($entity); $rowset = $table->select($params); return $rowset->current(); } public function getUserRoleInEntity($param, $groupCol) { $email = $this->returnEntity('user', ['id' => $param['u.id']])->email; $select = new Select; $profileId = ['profileId' => (new \Laminas\Db\Sql\Expression('IFNULL(up.profile_id, if(STRCMP(f.created_by, "' . $param['u.id'] . '") = 0, 2, 6))'))]; $rhhLit = new \Laminas\Db\Sql\Literal('rhh.robot_id = r.id and rhh.to IS NULL'); $joins = [ ['up', 'user_profile', 'u.id = up.user_id', 'inner'], ['rup', 'robot_user_profile', 'up.id = rup.user_profile_id', 'inner'], ['r', 'robot', 'rup.robot_id = r.id', 'inner'], ['rhh', 'robot_house_history', $rhhLit, 'left'], ['h', 'house', 'h.id = rhh.house_id or h.created_by = u.id', 'inner'], ['round', 'round', 'round.house_id = h.id', 'left'], ['f', 'farm', 'f.id = h.farm_id or f.created_by = u.id', 'inner'], ['an', 'alert_notification', 'an.robot_id = r.id and an.user_id = u.id', 'inner'], ['d', 'diary', 'd.round_id = round.id or d.created_by = u.id', 'inner'], ]; $idx = 6; switch ($param) { case array_key_exists('an.id', $param): $idx = 7; break; case array_key_exists('d.id', $param): $idx = 8; break; } $select->from(['u' => 'user']); $select->join([$joins[0][0] => $joins[0][1]], $joins[0][2], [], $joins[0][3]); $select->columns($profileId); foreach (range(1, $idx) as $i) { $select->join([$joins[$i][0] => $joins[$i][1]], $joins[$i][2], [], $joins[$i][3]); } $select->group($groupCol)->where($param); $results = $this->getTableGateway('user'); return $email == self::ADMIN ? '1' : $results->selectWith($select)->current()->profileId ?? '6'; } protected function returnEntityView($entity, $param, $rights = null, $groupCol) { $select = new Select; $select->from(['u' => 'user']) ->columns($entity == 'user' ? $this->viewConfig['user'] : []) ->join(['up' => 'user_profile'], 'u.id = up.user_id', ['role' => 'profile_id'], 'left') ->columns($rights) ->join(['rup' => 'robot_user_profile'], 'up.id = rup.user_profile_id', [], 'left') ->join(['r' => 'robot'], 'rup.robot_id = r.id', $entity == 'robot' ? $this->viewConfig['robot'] : [], 'left') ->join(['rhh' => 'robot_house_history'], new \Laminas\Db\Sql\Literal('rhh.robot_id = r.id and rhh.to IS NULL'), [], 'left') ->join(['h' => 'house'], 'h.id = rhh.house_id or h.created_by = u.id', $entity == 'house' ? $this->viewConfig['house'] : [], 'left') ->join(['round' => 'round'], 'round.house_id = h.id', $entity == 'round' ? $this->viewConfig['round'] : [], 'left') ->join(['f' => 'farm'], 'f.id = h.farm_id or f.created_by = u.id', $entity == 'farm' ? $this->viewConfig['farm'] : [], 'left') ->join(['an' => 'alert_notification'], 'an.robot_id = r.id and an.user_id = u.id', $entity == 'alert' ? $this->viewConfig['alert'] : [], 'left') ->join(['d' => 'diary'], 'round.id = d.round_id or d.created_by = u.id', $entity == 'diary' ? $this->viewConfig['diary'] : [], 'left') ->join(['c' => 'climate'], 'h.climate_id = c.id', $entity == 'house' ? ['climateType' => 'name_ld'] : [], 'left') ->join(['cc' => 'climate_controller'], 'h.climate_controller_id = cc.id', $entity == 'house' ? ['climateController' => 'name'] : [], 'left') ->join(['ht' => 'house_type'], 'h.house_type_id = ht.id', $entity == 'house' ? ['houseType' => 'name_ld'] : [], 'left') ->group($groupCol) ->where($param); $results = $this->getTableGateway('user'); return $results->selectWith($select)->current() ?? null; } protected function fetchEntities($userId, $entity, $param, $rights = null, $groupCol) { $creator = $this->getMyCreator($userId); $searchParams = [ 'range' => [ 'from' => ($entity === 'round' || $entity === 'alert') ? ($param['range'] != 'false' ? explode(" ", $param['range'])[0] : '1900-01-01') : null, 'to' => ($entity == 'round' || $entity === 'alert') ? ($param['range'] != 'false' ? explode(" ", $param['range'])[1] : '2222-01-01') : null, ], 'status' => isset($param['status']) ? ($param['status'] != 'true' ? $param['status'] : '1') : '1', 'exportable' => isset($param['exportable']) ? $param['exportable'] : null, 'ids' => [ 'farm' => isset($param['farmId']) ? ($param['farmId'] != 'false' ? $param['farmId'] : null) : null, 'robot' => isset($param['robotId']) ? ($param['robotId'] != 'false' ? $param['robotId'] : null) : null, 'house' => isset($param['houseId']) ? ($param['houseId'] != 'false' ? $param['houseId'] : null) : null ], 'search' => isset($param['search']) ? ($param['search'] != 'false' ? $param['search'] : null) : null ]; $offset = isset($param['offset']) && is_numeric($param['offset']) ? (int) $param['offset'] : 0; $limit = isset($param['limit']) && is_numeric($param['limit']) ? (int) $param['limit'] : 0; $queryBuilder = new QueryBuilder; $select = $queryBuilder->buildQuery($userId, $creator, $entity, $rights, $groupCol, $offset, $limit, $searchParams); $results = $this->getTableGateway('user'); return $results->selectWith($select)->toArray(); } protected function fetchAdmin($entity, $param) { $this->viewConfigAdmin[$entity]['canWrite'] = new \Laminas\Db\Sql\Expression('1'); $this->viewConfigAdmin[$entity]['canRead'] = new \Laminas\Db\Sql\Expression('1'); $this->viewConfigAdmin[$entity]['role'] = new \Laminas\Db\Sql\Expression('1'); $view = $this->viewConfigAdmin[$entity]; $offset = (int) $param['offset']; $limit = (int) $param['limit']; $queryBuilder = new QueryBuilder; $searchParams = [ 'range' => [ 'from' => $entity == 'round' ? ($param['range'] != 'false' ? explode(" ", $param['range'])[0] : '1900-01-01') : null, 'to' => $entity == 'round' ? ($param['range'] != 'false' ? explode(" ", $param['range'])[1] : '2222-01-01') : null, ], 'status' => isset($param['status']) ? ($param['status'] != 'true' ? $param['status'] : '1') : '1', 'ids' => [ 'farm' => isset($param['farmId']) ? ($param['farmId'] != 'false' ? $param['farmId'] : null) : null, 'robot' => isset($param['robotId']) ? ($param['robotId'] != 'false' ? $param['robotId'] : null) : null, 'house' => isset($param['houseId']) ? ($param['houseId'] != 'false' ? $param['houseId'] : null) : null ], 'search' => isset($param['search']) ? ($param['search'] != 'false' ? $param['search'] : null) : null ]; $select = $queryBuilder->buildAdminQuery($entity, $view, $searchParams, $offset, $limit); $results = $this->getTableGateway($entity); $result = $results->selectWith($select); return $result->toArray(); } function getTargetsForProductionCycleDay($roundId, $day) { $target = $this->returnEntity('targets', ['round_id' => $roundId])->targets; $command = "python3 /apps/chickenboy-site/scripts/interpolation/interpolate.py " . $roundId; exec($command, $output, $exitCode); $arr = []; if (is_null($target)) { $targetId = $this->getNewGlobalId('targets'); $targetsData = [ 'targets' => $output[0], 'round_id' => $roundId, 'id' => $targetId, 'created_by' => '0000000', ]; $this->insert('targets', $targetsData); $target = $this->returnEntity('targets', ['round_id' => $roundId])->targets; $targets = json_decode($target, true, 512, JSON_BIGINT_AS_STRING); foreach ($targets[$day] as $key => $target) { if (isset($this->config['observable_id'][$key])) { $arr[$this->config['observable_id'][$key]] = $target; } } return $arr; } else { $targets = json_decode($target, true, 512, JSON_BIGINT_AS_STRING); foreach ($targets[$day] as $key => $target) { if (isset($this->config['observable_id'][$key])) { $arr[$this->config['observable_id'][$key]] = $target; } } return $arr; } } }
Editor is loading...