baseurl = rtrim(trim($url), '/'); } public function activate(array $body): array { return $this->request('/api/v1/activations', $body); } public function validate(array $body): array { return $this->request('/api/v1/validations', $body); } public function refresh(array $body): array { return $this->request('/api/v1/authorizations/refresh', $body); } public function deactivate(string $installationid, array $body): array { $path = '/api/v1/activations/' . rawurlencode($installationid) . '/deactivate'; return $this->request($path, $body); } /** * @return array data from API envelope */ protected function request(string $path, array $body): array { global $CFG; require_once($CFG->libdir . '/filelib.php'); $url = $this->baseurl . $path; $json = json_encode($body, JSON_UNESCAPED_SLASHES); if ($json === false) { throw new registration_exception(error_mapper::LOCAL_NETWORK_ERROR, 'Could not encode request JSON'); } $curl = new \curl(['ignoresecurity' => true]); $raw = $curl->post($url, $json, [ 'CURLOPT_HTTPHEADER' => [ 'Content-Type: application/json', 'Accept: application/json', ], 'CURLOPT_TIMEOUT' => 30, ]); $info = $curl->get_info(); $httpcode = (int)($info['http_code'] ?? 0); if ($curl->get_errno()) { throw new registration_exception( error_mapper::LOCAL_NETWORK_ERROR, $curl->error . ' (url=' . $url . ')' ); } $raw = is_string($raw) ? trim($raw) : ''; if ($raw === '') { throw new registration_exception( error_mapper::LOCAL_NETWORK_ERROR, 'Empty response HTTP ' . $httpcode . ' from ' . $url ); } $decoded = json_decode($raw, true); if (!is_array($decoded)) { $snippet = \core_text::substr(preg_replace('/\s+/', ' ', $raw), 0, 180); throw new registration_exception( error_mapper::LOCAL_NETWORK_ERROR, 'Invalid JSON (HTTP ' . $httpcode . '): ' . $snippet ); } $requestid = isset($decoded['request_id']) ? (string)$decoded['request_id'] : null; if (empty($decoded['success'])) { $err = is_array($decoded['error'] ?? null) ? $decoded['error'] : []; $code = (string)($err['code'] ?? 'UNKNOWN'); $message = (string)($err['message'] ?? 'Registration request failed'); $details = isset($err['details']) && is_array($err['details']) ? $err['details'] : null; throw new registration_exception($code, $message, $details, $requestid); } $data = $decoded['data'] ?? []; if (!is_array($data)) { $data = []; } if ($requestid !== null && $requestid !== '') { $data['_request_id'] = $requestid; } return $data; } }