extensions->modules()->enabled(self::MODULE)) { return $this->moduleOff(); } $site = $request->input('scope') === 'site' && current_user_can(Access::MANAGE); $userId = $this->userId(); $status = (string) $request->input('status', ''); $limit = max(1, min(100, (int) $request->input('limit', 10))); $offset = max(0, (int) $request->input('offset', 0)); $rows = $this->journal->recent($site ? 0 : $userId, $status, $limit, $offset); return $this->ok(['items' => array_map(fn (array $row): array => [ 'id' => (int) $row['id'], 'tool' => (string) $row['tool'], 'summary' => StoredMessage::render((string) $row['summary']), 'status' => (string) $row['status'], 'via' => str_starts_with((string) ($row['run_id'] ?? ''), 'person') ? 'person' : 'model', 'created_at' => SessionResource::time(is_string($row['created_at'] ?? null) ? $row['created_at'] : null), 'undone_at' => SessionResource::time(is_string($row['undone_at'] ?? null) ? $row['undone_at'] : null), 'session' => is_string($row['session_uuid'] ?? null) ? ['id' => $row['session_uuid'], 'title' => (string) ($row['session_title'] ?? ''), 'studio' => str_starts_with((string) ($row['session_agent'] ?? ''), 'studio-')] : null, 'person' => $site ? $this->name((int) $row['user_id']) : null, 'can_undo' => (int) $row['user_id'] === $userId && $row['status'] === 'applied' && $this->journal->undoable((string) $row['tool']), 'edit_url' => is_array($row['after'] ?? null) && is_string($row['after']['edit_url'] ?? null) ? $row['after']['edit_url'] : null, ], $rows), 'site' => $site, 'meta' => ['total' => $this->journal->countRecent($site ? 0 : $userId, $status), 'offset' => $offset]]); } public function jobs(Request $request, JobQueue $jobs): JsonResponse { if (!$this->extensions->modules()->enabled(self::MODULE)) { return $this->moduleOff(); } $site = $request->input('scope') === 'site' && current_user_can(Access::MANAGE); $userId = $site ? 0 : $this->userId(); $limit = max(1, min(100, (int) $request->input('limit', 10))); $offset = max(0, (int) $request->input('offset', 0)); $rows = $jobs->recent($userId, $limit, $offset); return $this->ok(['items' => array_map(static fn (array $job): array => [ 'created_at' => SessionResource::time($job['created_at'] !== '' ? $job['created_at'] : null), 'updated_at' => SessionResource::time($job['updated_at'] !== '' ? $job['updated_at'] : null), ] + $job, $rows), 'site' => $site, 'meta' => [ 'total' => $jobs->countRecent($userId), 'offset' => $offset, ]]); } public function logs(Request $request): JsonResponse { if (!$this->extensions->modules()->enabled(self::MODULE)) { return $this->moduleOff(); } $site = $request->input('scope') === 'site' && current_user_can(Access::MANAGE); $userId = $site ? 0 : $this->userId(); $limit = max(1, min(100, (int) $request->input('limit', 10))); $offset = max(0, min(100000, (int) $request->input('offset', 0))); $event = (string) $request->input('event', ''); $event = in_array($event, Event::NAMES, true) ? $event : ''; $rows = $this->logs->recent($userId, $limit, $offset, $event); return $this->ok(['items' => array_map(fn (array $row): array => [ 'id' => (int) $row['id'], 'event' => (string) $row['event_name'], 'data' => $this->decodePayload((string) ($row['payload'] ?? '')), 'created_at' => SessionResource::time(is_string($row['created_at'] ?? null) ? $row['created_at'] : null), 'session' => is_string($row['session_uuid'] ?? null) ? [ 'id' => (string) $row['session_uuid'], 'title' => Redactor::mask((string) ($row['session_title'] ?? '')), 'studio' => str_starts_with((string) ($row['session_agent'] ?? ''), 'studio-'), ] : null, 'person' => $site && (int) ($row['owner_id'] ?? 0) > 0 ? $this->name((int) $row['owner_id']) : null, ], $rows), 'site' => $site, 'meta' => [ 'total' => $this->logs->countRecent($userId, $event), 'events' => Event::NAMES, 'offset' => $offset, ]]); } /** @return array */ protected function decodePayload(string $json): array { $payload = json_decode($json, true); return is_array($payload) ? $payload : []; } protected function name(int $userId): string { $user = get_userdata($userId); return $user instanceof \WP_User ? $user->display_name : '#' . $userId; } protected function moduleOff(): JsonResponse { return $this->error(__('The Activity page is switched off. An administrator can switch it on in Tools → Extensions.', 'maze-graph'), 503); } }