Public Source Viewer

비나래아카이브 개발자 포털

실제 서비스 구조를 살펴볼 수 있는 공개용 코드 뷰어입니다. 인증, 세션, 외부 연동, 토큰, 관리자 식별 등 보안상 민감한 구현은 파일 단위 또는 줄 단위로 검열됩니다.

Redacted View
src/routes/hinana-pedia.routes.ts
공개 가능
1 import { Router, Request, Response } from 'express';
2 import { deleteHinanaPediaReview, getHinanaPediaStats, getHinanaPediaWorks } from '../services/hinana-pedia.service';
3
4 const router = Router();
5 const SORTS = new Set(['recent', 'rating', 'reviews', 'title']);
6 const PAGE_SIZE = 20;
7
8 router.get('/hinana/pedia', (req: Request, res: Response) => {
9 const search = typeof req.query.q === 'string' ? req.query.q.trim().slice(0, 100) : '';
10 const requestedSort = typeof req.query.sort === 'string' ? req.query.sort : 'recent';
11 const sort = SORTS.has(requestedSort) ? requestedSort : 'recent';
12 const works = getHinanaPediaWorks(search, sort);
13 const totalPages = Math.max(1, Math.ceil(works.length / PAGE_SIZE));
14 const requestedPage = Number.parseInt(String(req.query.page || '1'), 10);
15 const page = Math.min(Math.max(Number.isFinite(requestedPage) ? requestedPage : 1, 1), totalPages);
16
17 res.render('./hinana/pedia', {
18 username: req.session.username || null,
19 [SECURITY REDACTED] 민감한 설정/인증/토큰 관련 코드입니다.
20 theme: req.session.theme || req.cookies.theme || 'light',
21 [SECURITY REDACTED] 민감한 설정/인증/토큰 관련 코드입니다.
22 works: works.slice((page - 1) * PAGE_SIZE, page * PAGE_SIZE),
23 stats: getHinanaPediaStats(),
24 search,
25 sort,
26 page,
27 totalPages
28 });
29 });
30
31 router.post('/hinana/pedia/review/:id/delete', (req: Request, res: Response) => {
32 [SECURITY REDACTED] 민감한 설정/인증/토큰 관련 코드입니다.
33 return res.status(403).send('관리자만 사용할 수 있습니다.');
34 }
35 deleteHinanaPediaReview(String(req.params.id || ''));
36 return res.redirect('/hinana/pedia');
37 });
38
39 export default router;
40