query() 붙일 필요 없음) return $this->repo->paginate($q, $perPage)->withQueryString(); } /** * @return array{notice:GcBoard, prev:?GcBoard, next:?GcBoard} */ public function detail(int $seq, Session $session): array { $notice = $this->repo->findOrFail($seq); // 조회수 (세션 기준 중복 방지) $hitKey = "cs_notice_hit_{$seq}"; if (!$session->has($hitKey)) { $this->repo->incrementHit($seq); $session->put($hitKey, 1); $notice->hit = (int)($notice->hit ?? 0) + 1; // 화면 즉시 반영용 } $prev = $this->repo->findPrev($notice); $next = $this->repo->findNext($notice); return [ 'notice' => $notice, 'prev' => $prev, 'next' => $next, ]; } public function download(int $seq, int $slot): array { $notice = $this->repo->findOrFail($seq); // visibleNotice 보장 $file = $slot === 1 ? (string)($notice->file_01 ?? '') : (string)($notice->file_02 ?? ''); $file = trim($file); if ($file === '') return ['ok' => false, 'path' => '', 'name' => '']; // DB에 URL/경로가 섞여 있어도 파일명만 뽑아서 안전하게 처리 $name = basename(parse_url($file, PHP_URL_PATH) ?? $file); $path = 'bbs/'.$name; if (!Storage::disk('public')->exists($path)) { return ['ok' => false, 'path' => '', 'name' => '']; } return ['ok' => true, 'path' => $path, 'name' => $name]; } }