setTable('subuser_grants'); } public function objectChanged(): void { // No need to invalidate the cache, since the plate_scans object is not cached } public function getObjectProperties(): void { $this->billing_customer_number = new object_property($this->table, $this->id, 'billing_customer_number', 'int'); $this->subuser = new object_property($this->table, $this->id, 'subuser', 'int'); $this->enabled = new object_property($this->table, $this->id, 'enabled', 'bool'); $this->note = new object_property($this->table, $this->id, 'note', 'string'); $this->permissions = new object_property($this->table, $this->id, 'permissions', 'json'); $this->created_at = new object_property($this->table, $this->id, 'created_at', 'timestamp'); $this->updated_at = new object_property($this->table, $this->id, 'updated_at', 'timestamp'); $this->deleted_at = new object_property($this->table, $this->id, 'deleted_at', 'timestamp'); } public function asArray(): array { return [ 'id' => (int)$this->id, 'billing_customer_number' => (int)$this->billing_customer_number->value(), 'subuser' => (int)$this->subuser->value(), 'enabled' => (bool)$this->enabled->value(), 'note' => $this->note->value(), 'permissions' => (function ($raw) { // Handle different representations from object_property: // - When type is 'json', object_property::value() may already return an array // - In older behavior, it could return a JSON string // Normalize to an array for API output if ($raw === null || $raw === '') { return []; } if (is_array($raw)) { return $raw; } if (is_string($raw)) { $decoded = json_decode($raw, true); return is_array($decoded) ? $decoded : []; } return []; })($this->permissions->value()), 'created_at' => $this->created_at->value(), 'updated_at' => $this->updated_at->value(), 'deleted_at' => $this->deleted_at->value(), ]; } /** * Add a new subuser grant to the database. * @param int $billing_customer_number * @param int $subuser * @param bool $enabled * @param string|null $note * @param array|null $permissions * @return $this * @throws Exception If the object creation fails */ public function add(int $billing_customer_number, int $subuser, bool $enabled, ?string $note, ?array $permissions = self::defaultPermissions): subuser_grants_o { global $db; $tmp = $this->add_object([ 'billing_customer_number' => (int)$billing_customer_number, 'subuser' => (int)$subuser, 'enabled' => (bool)$enabled, 'note' => !empty($note) ? $db->escape_string($note) : null, 'permissions' => !empty($permissions) ? json_encode($permissions) : json_encode([]), ]); $this->id = (int)$tmp; $this->getObjectProperties(); return $this; } public function getGrantsForSubuserAndCustomer(int $subuser_id, ?int $customer_number): array { $grants = self::getFieldsWhere([ 'billing_customer_number' => $customer_number, 'subuser' => $subuser_id, 'enabled' => 1, 'deleted_at' => null, ], ['permissions']); // Extract permissions from the grants $permissions = []; foreach ($grants as $grant) { $grant_permissions = json_decode($grant['permissions'], true); if (is_array($grant_permissions)) { $permissions = array_merge($permissions, $grant_permissions); } } return $permissions; } }